民工心事 发表于 2024-12-14 22:20:35

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

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

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

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

String name = "Peter";
String gender = "男";
int age = 23;
double sal = 3455.5;
String job = "经理";
System.out.println(name+gender+age+sal+job);

存在题目:
存储数据量少,写法要求严酷;
(2)用一行数据描述员工

String emp1 = "Peter-男-23-3455.5-经理";
String emp2 = "Shirley-女-28-5231.6-老板";
String[] emp1Mess = emp1.split("-");
System.out.println("name:"+emp1Mess
                   +"gender:"+emp1Mess
                   +"age:"+emp1Mess
                   +"sal:"+emp1Mess
                   +"job:"+emp1Mess
                  );

存在题目:
字符串中有各种数据类型,在现实使用时需要进行类型转换;
数据存储无规律
(3)用数组存储多个数据

      String emp1 = "Peter-男-23-3455.5-经理";
      String emp2 = "Shirley-女-28-5231.6-老板";
      String[] emps = new String[]{emp1,emp2};
      for (int i=0;i<emps.length;i++){
            String emp = emps;
            String[] empSplit = emp.split("-");
            System.out.println(empSplit);
      }



存在题目:
数组扩容困难,
(4)用聚集存储多个数据

      List<String> empList = new ArrayList<>(5);
      empList.add(emp1);
      empList.add(emp2);

      for (int i = 0; i<empList.size(); i++){
            System.out.println(empList.get(i));
      }

      Iterator<String> it = empList.iterator();
      while (it.hasNext()){
            String emp = it.next();
            System.out.println(emp);
      }

存在题目:
采用字符串的形式进行存储,取出过程很难把控数据的类型
2.面向对象

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

public class Emp {
    public String name;
    public String gender;
    public int age;
    public double sal;
    public String job;

}

public class EmpTestDemo1 {
    public static void main(String[] args) {
      Emp emp = new Emp(); // emp 没有和任何对象绑定
      emp.name = "Shirley";
      emp.age = 24;

      // 可以随便更改
      emp.name = "Shirley";
      System.out.println(emp.name);
      System.out.println(emp.age);
    }
}

存在题目:
属性值公开,可以被随便更改,不安全;
可以指定修改或取出的方式
(2)属性私有化,指定修改或读取方式——安全性

public class EmpAttr {
    private String name;
    private String gender;
    private int age;
    private double sal;
    private String job;

    public void setName(String name){
      this.name = name; // this 当前对象
      // this.name: 当前对象的属性name
    }

    public String getName(){
      return name;
    }
}

public class EmpAttrTest {
    public static void main(String[] args) {
      EmpAttr emp = new EmpAttr();
      emp.setName("Peter");
      System.out.println(emp.getName());
    }
}

(3)用构造器对类的属性赋值——从变量到属性

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

1)直接创建new

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

一个类会产生一个唯一的Class对象,JVM底层原理
https://i-blog.csdnimg.cn/blog_migrate/efafc3c62e8d84fc486bde17ad1863b8.png
https://i-blog.csdnimg.cn/blog_migrate/9710e655fd1ff0282991c9ade52df34d.png
获取Class对象的方式
// 不知道类型用?简写Class c = Car.class;
Class<?> c = Car.class;
// new对象之后再获取Clss
Class<?> C = new Car().getClass();

System.out.println(c);
System.out.println(C);

   作用创建对象:
// 1.创建对象
Car x = (Car) c.newInstance();
System.out.println(x);

3)Class.forName(类名)【调用static代码块中的代码】

// 通过包的包名加类名即可拿到
Class<?> clazz = Class.forName("com.tianju.entity.Car");
Car y = (Car) clazz.newInstance();
System.out.println(y);

【调用static代码块中的代码】
Pig类
public class Pig {
    // 静态代码块
    static { // JVM 的 Pig对象的 Class
      System.out.println("静态代码块");
    }

    {
      System.out.println("代码块");
    }
}

测试:
// 静态代码块执行1次,代码块执行2次
new Pig();
new Pig();

// 虚拟机什么时候把Class
Class.forName("com.tianju.entity.Pig");
Class.forName("com.tianju.entity.Pig");

从IO对象流到数据库【数据持久化存储】

https://i-blog.csdnimg.cn/blog_migrate/9d155ede660d32b07b0a7583e9bd6bd8.png
3.用IO对象流-serializable

public class EmpIO implements Serializable {
    private String name;
    private String gender;
    private int age;
    private double sal;
    private String job;
}

public class EmpIOTest {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
      EmpIO emp1 = new EmpIO("Peter", "男", 28, 5252.5, "经理");
      EmpIO emp2 = new EmpIO("Shirley", "女", 26, 6252.5, "老板");
      // 从内存写入硬盘,写
      String filePath = "D:\\Myprogram\\idea-workspace\\recruit\_v1.0" +
                "\\recruit\_v1.0\\src\\com\\qianbaidu\\recruit\\resource\\empIO.dat";
      ObjectOutputStream out = new ObjectOutputStream(
                new FileOutputStream(filePath)
      );
      List<EmpIO> list = new ArrayList<>();
      list.add(emp1);
      list.add(emp2);
      // 写入文件
      out.writeObject(list);
      out.flush();
      out.close();

      // 从硬盘读入内存,读
      ObjectInputStream in = new ObjectInputStream(
                new FileInputStream(filePath)
      );
      List<EmpIO> listIn = (List<EmpIO>) in.readObject(); // 向下转型
      System.out.println(listIn);


    }
}

存在题目:
数据存储方式不专业,读写困难;
需要有专业的方式进行数据的持久化——数据库;
4.数据库-SQL

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

package com.qianbaidu.recruit.main;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Getter @Setter
@AllArgsConstructor
@NoArgsConstructor
public class EmpJDBC {
    private Integer id;
    private String name;
    private String gender;
    private int age;
    private double sal;
    private String job;

    @Override
    public String toString() {
      return "\nEmpJDBC{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", gender='" + gender + '\'' +
                ", age=" + age +
                ", sal=" + sal +
                ", job='" + job + '\'' +
                '}';
    }
}


https://i-blog.csdnimg.cn/blog_migrate/09c952ab61146ad0a3e62b58c12d5cf7.png
(2)编写dao负责CRUD

package com.qianbaidu.recruit.main;

import com.qianbaidu.recruit.util.DbUtilJDBC;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class EmpJDBCDao {
    private DbUtilJDBC db;

    public EmpJDBCDao() {
      db = DbUtilJDBC.INSTANCE;
    }

    // 私有的拿单个的方法
    private EmpJDBC getEmp(ResultSet rs){
      EmpJDBC emp = null;
      try {
            if (rs.next()){
                emp = new EmpJDBC(rs.getInt("emp\_id"),
                        rs.getString("emp\_name"),
                        rs.getString("emp\_gender"),
                        rs.getInt("emp\_age"),
                        rs.getDouble("emp\_sal"),
                        rs.getString("emp\_job"));
            }
      } catch (SQLException e) {
            throw new RuntimeException(e);
      }
      db.close();
      return emp;
    }

    // 私有的拿多个的方法
    private List<EmpJDBC> getEmps(ResultSet rs){
      List<EmpJDBC> list = new ArrayList<>(5);
      try {
            while (rs.next()){
                EmpJDBC emp = new EmpJDBC(rs.getInt("emp\_id"),
                        rs.getString("emp\_name"),
                        rs.getString("emp\_gender"),
                        rs.getInt("emp\_age"),
                        rs.getDouble("emp\_sal"),
                        rs.getString("emp\_job"));
                list.add(emp);
            }
      } catch (SQLException e) {
            throw new RuntimeException(e);
      }
      return list;
    }


    /\*\*
\* 保存到数据库
\* @param emp 要保存的实体类
\*/
    public void save(EmpJDBC emp){
      db.connect();
      String sql = "INSERT INTO emp\_tab(emp\_id, emp\_name, emp\_gender, emp\_age, emp\_sal, emp\_job) " +
                "VALUES(?, ?, ?, ?, ?, ?) \n";
      db.prepareStatement(sql,
                emp.getId(),
                emp.getName(),
                emp.getGender(),
                emp.getAge(),
                emp.getSal(),
                emp.getJob());
      db.executeUpdate();
      db.close();
    }

    /\*\*
\* 根据id找数据库中的实体类的数据
\* @param id 唯一id
\* @return 实体类
\*/
    public EmpJDBC findById(Integer id){
      db.connect();
      String sql = "SELECT \* FROM emp\_tab WHERE emp\_id = ?";
      db.prepareStatement(sql,id);
      ResultSet rs = db.executeQuery();
      EmpJDBC emp = getEmp(rs);
      db.close();
      return emp;
    }

    /\*\*
\* 找到数据库中所有的数据
\* @return emp的集合List
\*/
    public List<EmpJDBC> findAll(){
      db.connect();
      db.prepareStatement("SELECT \* FROM emp\_tab" );
      ResultSet rs = db.executeQuery();


!(https://img-blog.csdnimg.cn/img_convert/9b1918d4f23f1785a7ac00e14245c819.png)
!(https://img-blog.csdnimg.cn/img_convert/1ada9a3f32911722ba8b687aa8ed3223.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618631832)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**



    /\*\*
\* 找到数据库中所有的数据
\* @return emp的集合List
\*/
    public List<EmpJDBC> findAll(){
      db.connect();
      db.prepareStatement("SELECT \* FROM emp\_tab" );
      ResultSet rs = db.executeQuery();


[外链图片转存中...(img-rQJ2zoBH-1715789705531)]
[外链图片转存中...(img-hD7MfhAE-1715789705532)]

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618631832)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Java基础(6)——架构迭代--从面向过程到面向对象,到IO流再到数据库