ResultSet 结果封装为对象
# 6.ResultSet 结果封装为对象
现在我们对 JDBC 的基本查询有了一定的概念,接下来我们来做个小练习。这个练习的目的有二:加深对 JDBC 的理解,并对封装为对象有初步的认知,为后续学习数据库框架打下基础。
# 数据库表和类的关系
举一个具体的例子
一个数据库表 students,有很多行,每一行都代表一个学生的信息;而每一列代表某个具体的学生的信息。例如学生有姓名、年龄、性别、年级等....
而在 Java 中,万物皆对象,用类定义对象的模板,然后创建一个个具体的对象,每个对象有各自的属性。
我们经常有这样的需求:
- 定义一个类,与数据库表对应
- 将数据库里查出来的数据,封装为一个个对象,然后执行一些操作
- 当对象里的属性更新后,我们经常需要同步更新数据库里的数据。
我们需要完成这样的需求:定义一个方法,查询 students 表的所有数据,然后用一个集合存储。实现步骤:
- 定义 Student 类
- 定义方法
public List<Student> findAll(){}
- 实现方法
# 定义 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
2
3
4
5
6
7
然后生成 getter、setter 和 toString 方法。
# 定义 findAll 方法
思路如下:
- 使用 JDBC 查询出所有数据,然后用 ResultSet 接受
- 逐列读取数据
- 新建一个 Student 对象,通过 set 方法设置数据
- 添加到 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
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
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
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
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
上次更新: 2024/10/1 21:14:36