从 01 开始 从 01 开始
首页
  • 📚 计算机基础

    • 计算机简史
    • 数字电路
    • 计算机组成原理
    • 操作系统
    • Linux
    • 计算机网络
    • 数据库
    • 编程工具
    • 装机
  • 🎨 前端

    • Node
  • JavaSE
  • Java 高级
  • JavaEE

    • 构建、依赖管理
    • Ant
    • Maven
    • 日志框架
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • 环境管理和配置管理-科普篇
    • Servlet
  • Spring

    • Spring基础
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC

    • SpringMVC 基础
  • SpringBoot

    • SpringBoot 基础
  • Windows 使用技巧
  • 手机相关技巧
  • 最全面的输入法教程
  • 最全面的浏览器教程
  • Office
  • 图片类工具
  • 效率类工具
  • 最全面的 RSS 教程
  • 码字工具
  • 各大平台
  • 校招
  • 五险一金
  • 职场规划
  • 关于离职
  • 杂谈
  • 自媒体
  • 📖 读书

    • 读书工具
    • 走进科学
  • 🌍 英语

    • 从零开始学英语
    • 英语兔的相关视频
    • Larry 想做技术大佬的相关视频
  • 🏛️ 政治

    • 反腐
    • GFW
    • 404 内容
    • 审查与自我审查
    • 互联网
    • 战争
    • 读书笔记
  • 💰 经济

    • 关于税
    • 理财
  • 💪 健身

    • 睡眠
    • 皮肤
    • 口腔健康
    • 学会呼吸
    • 健身日志
  • 🏠 其他

    • 驾驶技能
    • 租房与买房
    • 厨艺
  • 电影

    • 电影推荐
  • 电视剧
  • 漫画

    • 漫画软件
    • 漫画推荐
  • 游戏

    • Steam
    • 三国杀
    • 求生之路
  • 小说
  • 关于本站
  • 关于博主
  • 打赏
  • 网站动态
  • 友人帐
  • 从零开始搭建博客
  • 搭建邮件服务器
  • 本站分享
  • 🌈 生活

    • 2022
    • 2023
    • 2024
    • 2025
  • 📇 文章索引

    • 文章分类
    • 文章归档

晓林

程序猿,自由职业者,博主,英语爱好者,健身达人
首页
  • 📚 计算机基础

    • 计算机简史
    • 数字电路
    • 计算机组成原理
    • 操作系统
    • Linux
    • 计算机网络
    • 数据库
    • 编程工具
    • 装机
  • 🎨 前端

    • Node
  • JavaSE
  • Java 高级
  • JavaEE

    • 构建、依赖管理
    • Ant
    • Maven
    • 日志框架
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • 环境管理和配置管理-科普篇
    • Servlet
  • Spring

    • Spring基础
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC

    • SpringMVC 基础
  • SpringBoot

    • SpringBoot 基础
  • Windows 使用技巧
  • 手机相关技巧
  • 最全面的输入法教程
  • 最全面的浏览器教程
  • Office
  • 图片类工具
  • 效率类工具
  • 最全面的 RSS 教程
  • 码字工具
  • 各大平台
  • 校招
  • 五险一金
  • 职场规划
  • 关于离职
  • 杂谈
  • 自媒体
  • 📖 读书

    • 读书工具
    • 走进科学
  • 🌍 英语

    • 从零开始学英语
    • 英语兔的相关视频
    • Larry 想做技术大佬的相关视频
  • 🏛️ 政治

    • 反腐
    • GFW
    • 404 内容
    • 审查与自我审查
    • 互联网
    • 战争
    • 读书笔记
  • 💰 经济

    • 关于税
    • 理财
  • 💪 健身

    • 睡眠
    • 皮肤
    • 口腔健康
    • 学会呼吸
    • 健身日志
  • 🏠 其他

    • 驾驶技能
    • 租房与买房
    • 厨艺
  • 电影

    • 电影推荐
  • 电视剧
  • 漫画

    • 漫画软件
    • 漫画推荐
  • 游戏

    • Steam
    • 三国杀
    • 求生之路
  • 小说
  • 关于本站
  • 关于博主
  • 打赏
  • 网站动态
  • 友人帐
  • 从零开始搭建博客
  • 搭建邮件服务器
  • 本站分享
  • 🌈 生活

    • 2022
    • 2023
    • 2024
    • 2025
  • 📇 文章索引

    • 文章分类
    • 文章归档
  • JavaSE

  • JavaSenior

  • JavaEE

    • JavaEE 概念

    • Ant

    • Maven

    • 日志

    • Junit

    • JDBC

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

  • JavaWeb

  • Spring

  • 主流框架

  • SpringMVC

  • SpringBoot

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

ResultSet 结果封装为对象

# 6.ResultSet 结果封装为对象

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

# 数据库表和类的关系

举一个具体的例子

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

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

我们经常有这样的需求:

  1. 定义一个类,与数据库表对应

  2. 将数据库里查出来的数据,封装为一个个对象,然后执行一些操作

  3. 当对象里的属性更新后,我们经常需要同步更新数据库里的数据。 ‍ 我们需要完成这样的需求:定义一个方法,查询 students 表的所有数据,然后用一个集合存储。实现步骤:

  4. 定义 Student 类

  5. 定义方法 public List<Student> findAll(){}

  6. 实现方法 ‍

# 定义 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
上次更新: 2025/6/3 09:31:54
PreparedStatement 是如何防止SQL注入的
JDBC 工具类

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

最近更新
01
语雀文档一键下载至本地教程
07-04
02
要成功,就不要低估环境对你的影响
07-03
03
血泪教训:电子设备要定期开机
07-02
更多文章>
Theme by Vdoing | Copyright © 2022-2025 | 粤 ICP 备 2022067627 号 -1 | 粤公网安备 44011302003646 号 | 点击查看十年之约
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式