从01开始 从01开始
首页
  • 计算机科学导论
  • 数字电路
  • 计算机组成原理

    • 计算机组成原理-北大网课
  • 操作系统
  • Linux
  • Docker
  • 计算机网络
  • 计算机常识
  • Git
  • JavaSE
  • Java高级
  • JavaEE

    • Ant
    • Maven
    • Log4j
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • Servlet
  • Spring
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC
  • SpringBoot
  • 学习网课的心得
  • 输入法
  • 节假日TodoList
  • 其他
  • 关于本站
  • 网站日记
  • 友人帐
  • 如何搭建一个博客
GitHub (opens new window)

peterjxl

人生如逆旅,我亦是行人
首页
  • 计算机科学导论
  • 数字电路
  • 计算机组成原理

    • 计算机组成原理-北大网课
  • 操作系统
  • Linux
  • Docker
  • 计算机网络
  • 计算机常识
  • Git
  • JavaSE
  • Java高级
  • JavaEE

    • Ant
    • Maven
    • Log4j
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • Servlet
  • Spring
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC
  • SpringBoot
  • 学习网课的心得
  • 输入法
  • 节假日TodoList
  • 其他
  • 关于本站
  • 网站日记
  • 友人帐
  • 如何搭建一个博客
GitHub (opens new window)
  • JavaSE

  • JavaSenior

  • JavaEE

    • JavaEE概念

    • Ant

    • Maven

    • 日志

    • Junit

    • JDBC

      • 什么是JDBC
      • JDBC连接、查询和更新
      • JDBC连接字符串
      • JDBC常用类介绍
      • PreparedStatement是如何防止SQL注入的
      • ResultSet结果封装为对象
        • 数据库表和类的关系
        • 定义JavaBean
        • 定义findAll方法
        • main方法里执行
        • 完整代码
      • JDBC工具类
      • JDBC更新
      • JDBC事务和批量
      • JDBC连接池
      • JDBCTemplate
      • JDBC
    • XML和JSON

    • Java
  • JavaWeb

  • Spring

  • 主流框架

  • SpringMVC

  • SpringBoot

  • Java并发

  • Java源码

  • JVM

  • 韩顺平

  • Java
  • Java
  • JavaEE
  • JDBC
2023-03-24
目录

ResultSet结果封装为对象

# 6.ResultSet结果封装为对象

现在我们对JDBC的基本查询有了一定的概念,接下来我们来做个小练习。这个练习的目的有二:加深对JDBC的理解,并对封装为对象有初步的认知,为后续学习数据库框架打下基础。

‍

‍

# 数据库表和类的关系

举一个具体的例子

一个数据库表students,有很多行,每一行都代表一个学生的信息;而每一列代表某个具体的学生的信息。例如学生有姓名、年龄、性别、年级等....

而在Java中,万物皆对象,用类定义对象的模板,然后创建一个个具体的对象,每个对象有各自的属性。

我们经常有这样的需求:

  1. 定义一个类,与数据库表对应
  2. 将数据库里查出来的数据,封装为一个个对象,然后执行一些操作
  3. 当对象里的属性更新后,我们经常需要同步更新数据库里的数据。

‍

我们需要完成这样的需求:定义一个方法,查询students表的所有数据,然后用一个集合存储。实现步骤:

  1. 定义Student类
  2. 定义方法public List<Student> findAll(){}​
  3. 实现方法

‍

# 定义JavaBean

这里定义一个类Student,类的成员和数据库表一一对应(类的成员名字最好和数据库里的一样):

class Student{
    private int id;
    private String name ;
    private int gender;
    private int grade;
    private int score;
}
1
2
3
4
5
6
7

然后生成getter、setter和toString方法。

‍

‍

# 定义findAll方法

思路如下:

  1. 使用JDBC查询出所有数据,然后用ResultSet接受
  2. 逐列读取数据
  3. 新建一个Student对象,通过set方法设置数据
  4. 添加到List里

‍

实现如下:

public static List<Student> findAll() throws Exception{
        Connection conn = null;
        PreparedStatement statement = null;
        ResultSet rs = null;
        String sql = "select * from students";
        List<Student> list = new ArrayList<Student>();
      
        Class.forName("com.mysql.cj.jdbc.Driver");
        conn = DriverManager.getConnection("jdbc:mysql:///learnjdbc","learn","learnpassword");
        statement = conn.prepareStatement(sql);
        rs = statement.executeQuery();
        while (rs.next()){
            int id = rs.getInt("id");
            String name = rs.getString("name");
            int gender = rs.getInt("gender");
            int grade = rs.getInt("grade");
            int score = rs.getInt("score");
  
            Student stu = new Student();
            stu.setId(id);
            stu.setName(name);
            stu.setGender(gender);
            stu.setGrade(grade);
            stu.setScore(score);
  
            list.add(stu);
        }
        rs.close();
        statement.close();
        conn.close();
      
        return  list;
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

‍

逐个获取列数据,然后再逐个封装到对象里,非常麻烦,并且容易出错,后续我们会介绍更方便的工具,可以帮我们一键生成这样的代码。

‍

‍

# main方法里执行

public static void main(String[] args) {
    List<Student> list = findAll();
    for (Student stu : list) {
        System.out.println(stu.toString());
    }
}
1
2
3
4
5
6

‍

‍

运行结果如下:

Student{id=1, name='小明', gender=1, grade=1, score=88}
Student{id=2, name='小红', gender=1, grade=1, score=95}
Student{id=3, name='小军', gender=0, grade=1, score=93}
Student{id=4, name='小白', gender=0, grade=1, score=100}
Student{id=5, name='小牛', gender=1, grade=2, score=96}
Student{id=6, name='小兵', gender=1, grade=2, score=99}
Student{id=7, name='小强', gender=0, grade=2, score=86}
Student{id=8, name='小乔', gender=0, grade=2, score=79}
Student{id=9, name='小青', gender=1, grade=3, score=85}
Student{id=10, name='小王', gender=1, grade=3, score=90}
Student{id=11, name='小林', gender=0, grade=3, score=91}
Student{id=12, name='小贝', gender=0, grade=3, score=77}
1
2
3
4
5
6
7
8
9
10
11
12

‍

# 完整代码

package chapter2JDBC;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

/**
 * 定义一个方法,查询students表的所有数据,然后用一个集合存储。
 */
public class JDBCDemo11Class {
    public static void main(String[] args) {
        List<Student> list = findAll();
        for (Student stu : list) {
            System.out.println(stu.toString());
        }
    }

    public static List<Student> findAll(){
        Connection conn = null;
        PreparedStatement statement = null;
        ResultSet rs = null;
        String sql = "select * from students";
        List<Student> list = new ArrayList<Student>();

        try{
            Class.forName("com.mysql.cj.jdbc.Driver");
            conn = DriverManager.getConnection("jdbc:mysql:///learnjdbc","learn","learnpassword");
            statement = conn.prepareStatement(sql);
            rs = statement.executeQuery();
            while (rs.next()){
                int id = rs.getInt("id");
                String name = rs.getString("name");
                int gender = rs.getInt("gender");
                int grade = rs.getInt("grade");
                int score = rs.getInt("score");

                Student stu = new Student();
                stu.setId(id);
                stu.setName(name);
                stu.setGender(gender);
                stu.setGrade(grade);
                stu.setScore(score);

                list.add(stu);
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            try {
                rs.close();
                statement.close();
                conn.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return  list;
    }
}

/**
 * 封装Students表数据的JavaBean
 */
class Student{
    private int id;
    private String name ;
    private int gender;
    private int grade;
    private int score;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getGender() {
        return gender;
    }

    public void setGender(int gender) {
        this.gender = gender;
    }

    public int getGrade() {
        return grade;
    }

    public void setGrade(int grade) {
        this.grade = grade;
    }

    public int getScore() {
        return score;
    }

    public void setScore(int score) {
        this.score = score;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", gender=" + gender +
                ", grade=" + grade +
                ", score=" + score +
                '}';
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
在GitHub上编辑此页 (opens new window)
上次更新: 2023/5/6 21:54:08
PreparedStatement是如何防止SQL注入的
JDBC工具类

← PreparedStatement是如何防止SQL注入的 JDBC工具类→

Theme by Vdoing | Copyright © 2022-2023 粤ICP备2022067627号-1 粤公网安备 44011302003646号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式