Java基础(6)——架构迭代--从面向过程到面向对象,到IO流再到数据库 ...

打印 上一主题 下一主题

主题 885|帖子 885|积分 2655



网上学习资料一大堆,但假如学到的知识不成体系,遇到题目时只是浅尝辄止,不再深入研究,那么很难做到真正的技能提升。
需要这份体系化的资料的朋友,可以戳这里获取
一个人可以走的很快,但一群人才气走的更远!不论你是正从事IT行业的老鸟或是对IT行业感爱好的新人,都欢迎加入我们的的圈子(技能交换、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习发展!
面向过程到面向对象到数据库【数据存储】

要点:解决数据的存储和运算
题目:为什么要使用面向对象的方式?
1.面向过程

从面向过程到面向对象,例如描述一个员工:姓名,性别,年龄,工资,职位
(1)用变量和类型描述

  1. String name = "Peter";
  2. String gender = "男";
  3. int age = 23;
  4. double sal = 3455.5;
  5. String job = "经理";
  6. System.out.println(name+gender+age+sal+job);
复制代码
存在题目:
存储数据量少,写法要求严酷;
(2)用一行数据描述员工

  1. String emp1 = "Peter-男-23-3455.5-经理";
  2. String emp2 = "Shirley-女-28-5231.6-老板";
  3. String[] emp1Mess = emp1.split("-");
  4. System.out.println("name:"+emp1Mess[0]
  5.                    +"gender:"+emp1Mess[1]
  6.                    +"age:"+emp1Mess[2]
  7.                    +"sal:"+emp1Mess[3]
  8.                    +"job:"+emp1Mess[4]
  9.                   );
复制代码
存在题目:
字符串中有各种数据类型,在现实使用时需要进行类型转换;
数据存储无规律
(3)用数组存储多个数据

  1.         String emp1 = "Peter-男-23-3455.5-经理";
  2.         String emp2 = "Shirley-女-28-5231.6-老板";
  3.         String[] emps = new String[]{emp1,emp2};
  4.         for (int i=0;i<emps.length;i++){
  5.             String emp = emps[i];
  6.             String[] empSplit = emp.split("-");
  7.             System.out.println(empSplit[0]);
  8.         }
复制代码
存在题目:
数组扩容困难,
(4)用聚集存储多个数据

  1.         List<String> empList = new ArrayList<>(5);
  2.         empList.add(emp1);
  3.         empList.add(emp2);
  4.         for (int i = 0; i<empList.size(); i++){
  5.             System.out.println(empList.get(i));
  6.         }
  7.         Iterator<String> it = empList.iterator();
  8.         while (it.hasNext()){
  9.             String emp = it.next();
  10.             System.out.println(emp);
  11.         }
复制代码
存在题目:
采用字符串的形式进行存储,取出过程很难把控数据的类型
2.面向对象

(1)新建一个Emp类型的对象——存多种类型的数据

  1. public class Emp {
  2.     public String name;
  3.     public String gender;
  4.     public int age;
  5.     public double sal;
  6.     public String job;
  7. }
复制代码
  1. public class EmpTestDemo1 {
  2.     public static void main(String[] args) {
  3.         Emp emp = new Emp(); // emp 没有和任何对象绑定
  4.         emp.name = "Shirley";
  5.         emp.age = 24;
  6.         // 可以随便更改
  7.         emp.name = "Shirley";
  8.         System.out.println(emp.name);
  9.         System.out.println(emp.age);
  10.     }
  11. }
复制代码
存在题目:
属性值公开,可以被随便更改,不安全;
可以指定修改或取出的方式
(2)属性私有化,指定修改或读取方式——安全性

  1. public class EmpAttr {
  2.     private String name;
  3.     private String gender;
  4.     private int age;
  5.     private double sal;
  6.     private String job;
  7.     public void setName(String name){
  8.         this.name = name; // this 当前对象
  9.         // this.name: 当前对象的属性name
  10.     }
  11.     public String getName(){
  12.         return name;
  13.     }
  14. }
复制代码
  1. public class EmpAttrTest {
  2.     public static void main(String[] args) {
  3.         EmpAttr emp = new EmpAttr();
  4.         emp.setName("Peter");
  5.         System.out.println(emp.getName());
  6.     }
  7. }
复制代码
(3)用构造器对类的属性赋值——从变量到属性



至此,用面向对象的方法,解决了差别数据类型存储差别的属性值,来表现一个事物——比如员工的题目;
联合java提供的聚集,就可以实现有序存储多个员工;
存在题目:
数据不能持久化保存;
补充:创建对象的三种方式

1)直接创建new

Car.java 编译成 Car.clase 类加载到 JVM 中,加载时还没有创建对象;
进入JVM中给类Car创建单独的唯一的对象Class 类,该Class对象中存储了Car类的一些必要信息,没有记录相关的值;
以Class对象生产成多个Car对象,通过Class类映射出多个Car对象
2)反射

一个类会产生一个唯一的Class对象,JVM底层原理


获取Class对象的方式
  1. // 不知道类型用?简写Class c = Car.class;
  2. Class<?> c = Car.class;
  3. // new对象之后再获取Clss
  4. Class<?> C = new Car().getClass();
  5. System.out.println(c);
  6. System.out.println(C);
复制代码
  作用创建对象:
  1. // 1.创建对象
  2. Car x = (Car) c.newInstance();
  3. System.out.println(x);
复制代码
3)Class.forName(类名)【调用static代码块中的代码】

  1. // 通过包的包名加类名即可拿到
  2. Class<?> clazz = Class.forName("com.tianju.entity.Car");
  3. Car y = (Car) clazz.newInstance();
  4. System.out.println(y);
复制代码
【调用static代码块中的代码】
Pig类
  1. public class Pig {
  2.     // 静态代码块
  3.     static { // JVM 的 Pig对象的 Class
  4.         System.out.println("静态代码块");
  5.     }
  6.     {
  7.         System.out.println("代码块");
  8.     }
  9. }
复制代码
测试:
  1. // 静态代码块执行1次,代码块执行2次
  2. new Pig();
  3. new Pig();
  4. // 虚拟机什么时候把Class
  5. Class.forName("com.tianju.entity.Pig");
  6. Class.forName("com.tianju.entity.Pig");
复制代码
从IO对象流到数据库【数据持久化存储】


3.用IO对象流-serializable

  1. public class EmpIO implements Serializable {
  2.     private String name;
  3.     private String gender;
  4.     private int age;
  5.     private double sal;
  6.     private String job;
  7. }
复制代码
  1. public class EmpIOTest {
  2.     public static void main(String[] args) throws IOException, ClassNotFoundException {
  3.         EmpIO emp1 = new EmpIO("Peter", "男", 28, 5252.5, "经理");
  4.         EmpIO emp2 = new EmpIO("Shirley", "女", 26, 6252.5, "老板");
  5.         // 从内存写入硬盘,写
  6.         String filePath = "D:\\Myprogram\\idea-workspace\\recruit\_v1.0" +
  7.                 "\\recruit\_v1.0\\src\\com\\qianbaidu\\recruit\\resource\\empIO.dat";
  8.         ObjectOutputStream out = new ObjectOutputStream(
  9.                 new FileOutputStream(filePath)
  10.         );
  11.         List<EmpIO> list = new ArrayList<>();
  12.         list.add(emp1);
  13.         list.add(emp2);
  14.         // 写入文件
  15.         out.writeObject(list);
  16.         out.flush();
  17.         out.close();
  18.         // 从硬盘读入内存,读
  19.         ObjectInputStream in = new ObjectInputStream(
  20.                 new FileInputStream(filePath)
  21.         );
  22.         List<EmpIO> listIn = (List<EmpIO>) in.readObject(); // 向下转型
  23.         System.out.println(listIn);
  24.     }
  25. }
复制代码
存在题目:
数据存储方式不专业,读写困难;
需要有专业的方式进行数据的持久化——数据库;
4.数据库-SQL

(1)创建实体类&对应的表

  1. package com.qianbaidu.recruit.main;
  2. import lombok.AllArgsConstructor;
  3. import lombok.Getter;
  4. import lombok.NoArgsConstructor;
  5. import lombok.Setter;
  6. @Getter @Setter
  7. @AllArgsConstructor
  8. @NoArgsConstructor
  9. public class EmpJDBC {
  10.     private Integer id;
  11.     private String name;
  12.     private String gender;
  13.     private int age;
  14.     private double sal;
  15.     private String job;
  16.     @Override
  17.     public String toString() {
  18.         return "\nEmpJDBC{" +
  19.                 "id=" + id +
  20.                 ", name='" + name + '\'' +
  21.                 ", gender='" + gender + '\'' +
  22.                 ", age=" + age +
  23.                 ", sal=" + sal +
  24.                 ", job='" + job + '\'' +
  25.                 '}';
  26.     }
  27. }
复制代码

(2)编写dao负责CRUD

  1. package com.qianbaidu.recruit.main;
  2. import com.qianbaidu.recruit.util.DbUtilJDBC;
  3. import java.sql.ResultSet;
  4. import java.sql.SQLException;
  5. import java.util.ArrayList;
  6. import java.util.List;
  7. public class EmpJDBCDao {
  8.     private DbUtilJDBC db;
  9.     public EmpJDBCDao() {
  10.         db = DbUtilJDBC.INSTANCE;
  11.     }
  12.     // 私有的拿单个的方法
  13.     private EmpJDBC getEmp(ResultSet rs){
  14.         EmpJDBC emp = null;
  15.         try {
  16.             if (rs.next()){
  17.                 emp = new EmpJDBC(rs.getInt("emp\_id"),
  18.                         rs.getString("emp\_name"),
  19.                         rs.getString("emp\_gender"),
  20.                         rs.getInt("emp\_age"),
  21.                         rs.getDouble("emp\_sal"),
  22.                         rs.getString("emp\_job"));
  23.             }
  24.         } catch (SQLException e) {
  25.             throw new RuntimeException(e);
  26.         }
  27.         db.close();
  28.         return emp;
  29.     }
  30.     // 私有的拿多个的方法
  31.     private List<EmpJDBC> getEmps(ResultSet rs){
  32.         List<EmpJDBC> list = new ArrayList<>(5);
  33.         try {
  34.             while (rs.next()){
  35.                 EmpJDBC emp = new EmpJDBC(rs.getInt("emp\_id"),
  36.                         rs.getString("emp\_name"),
  37.                         rs.getString("emp\_gender"),
  38.                         rs.getInt("emp\_age"),
  39.                         rs.getDouble("emp\_sal"),
  40.                         rs.getString("emp\_job"));
  41.                 list.add(emp);
  42.             }
  43.         } catch (SQLException e) {
  44.             throw new RuntimeException(e);
  45.         }
  46.         return list;
  47.     }
  48.     /\*\*
  49. \* 保存到数据库
  50. \* @param emp 要保存的实体类
  51. \*/
  52.     public void save(EmpJDBC emp){
  53.         db.connect();
  54.         String sql = "INSERT INTO emp\_tab(emp\_id, emp\_name, emp\_gender, emp\_age, emp\_sal, emp\_job) " +
  55.                 "VALUES(?, ?, ?, ?, ?, ?) \n";
  56.         db.prepareStatement(sql,
  57.                 emp.getId(),
  58.                 emp.getName(),
  59.                 emp.getGender(),
  60.                 emp.getAge(),
  61.                 emp.getSal(),
  62.                 emp.getJob());
  63.         db.executeUpdate();
  64.         db.close();
  65.     }
  66.     /\*\*
  67. \* 根据id找数据库中的实体类的数据
  68. \* @param id 唯一id
  69. \* @return 实体类
  70. \*/
  71.     public EmpJDBC findById(Integer id){
  72.         db.connect();
  73.         String sql = "SELECT \* FROM emp\_tab WHERE emp\_id = ?";
  74.         db.prepareStatement(sql,id);
  75.         ResultSet rs = db.executeQuery();
  76.         EmpJDBC emp = getEmp(rs);
  77.         db.close();
  78.         return emp;
  79.     }
  80.     /\*\*
  81. \* 找到数据库中所有的数据
  82. \* @return emp的集合List
  83. \*/
  84.     public List<EmpJDBC> findAll(){
  85.         db.connect();
  86.         db.prepareStatement("SELECT \* FROM emp\_tab" );
  87.         ResultSet rs = db.executeQuery();
  88. ![img](https://img-blog.csdnimg.cn/img_convert/9b1918d4f23f1785a7ac00e14245c819.png)
  89. ![img](https://img-blog.csdnimg.cn/img_convert/1ada9a3f32911722ba8b687aa8ed3223.png)
  90. **网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
  91. **[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618631832)**
  92. **一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
  93.     /\*\*
  94. \* 找到数据库中所有的数据
  95. \* @return emp的集合List
  96. \*/
  97.     public List<EmpJDBC> findAll(){
  98.         db.connect();
  99.         db.prepareStatement("SELECT \* FROM emp\_tab" );
  100.         ResultSet rs = db.executeQuery();
  101. [外链图片转存中...(img-rQJ2zoBH-1715789705531)]
  102. [外链图片转存中...(img-hD7MfhAE-1715789705532)]
  103. **网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
  104. **[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618631832)**
  105. **一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

民工心事

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表