从 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 结果封装为对象
      • JDBC 工具类
        • 定义工具类 JDBCUtils
        • 释放资源的代码
        • 获取数据库连接池的的方法
        • 测试 JDBCUtils
        • 优化读取配置文件的代码
        • 现成的工具类
        • 总结
      • JDBC 更新
      • JDBC 事务和批量
      • JDBC 连接池
      • JDBCTemplate
    • XML 和 JSON

  • JavaWeb

  • Spring

  • 主流框架

  • SpringMVC

  • SpringBoot

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

JDBC 工具类

# 7.JDBC 工具类

我们之前学习和使用 JDBC 查询的时候,可以发现有非常非常多的重复代码

  1. 获取 Connection 对象
  2. 使用完后要逐个 close 对象

我们之前练习的这么多类中,每个类都有很多的重复代码。

‍

# 定义工具类 JDBCUtils

为了解决上述问题,我们可以定义一个工具类,抽取公用的代码:

  1. 注册驱动的代码
  2. 获取连接的代码
  3. 抽取方法释放资源

我们先从简单的释放资源的代码开始: ‍

# 释放资源的代码

分两种情况:

  1. 释放 Connection 对象、Statement 对象
  2. 释放 Connection 对象、Statement 对象和 ResultSet 对象

为此,得有重载的方法

实现如下:

package chapter2JDBC;

import java.sql.*;

/**
 * JDBC 工具类
 */
public class JDBCUtils {

    /**
     * 释放资源
     * @param stmt
     * @param conn
     */
    public static void close(Statement stmt, Connection conn){
        if(null != stmt){
            try {
                stmt.close();
            }catch (SQLException e){
                e.printStackTrace();
            }
        }

        if(null != conn){
            try {
                conn.close();
            }catch (SQLException e){
                e.printStackTrace();
            }
        }
    }

    /**
     * 释放资源
     * @param rs
     * @param stmt
     * @param conn
     */
    public static void close(ResultSet rs, Statement stmt, Connection conn){
        if(null != rs){
            try {
                rs.close();
            }catch (SQLException e){
                e.printStackTrace();
            }
        }

        if(null != stmt){
            try {
                stmt.close();
            }catch (SQLException e){
                e.printStackTrace();
            }
        }

        if(null != conn){
            try {
                conn.close();
            }catch (SQLException e){
                e.printStackTrace();
            }
        }
    }
}

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

# 获取数据库连接池的的方法

首先,我们定义的是一个通用的工具类,因此,为了通用性,数据库连接字符串、用户名和密码都不是固定的,也不应该是固定的(写死的),因为有可能使用其他数据库、其他用户和密码。

有读者可能会想到,使用传参的方式来实行:

public static Connection getConnection(String url, String username,String password) throws Exception{
    DriverManager.getConnection(url, username, password);
}
1
2
3

‍ 但其实,这样和封装前有什么区别呢:甚至不如不封装

DriverManager.getConnection(JDBC_URL, JDBC_USER, JDBC_PASSWORD);
1

并且,为了安全起见,数据库密码可能会定期更换的,如果为此每次都修改代码中定义的密码字段,非常麻烦,怎么办呢?

我们可以使用配置文件!这种方式也是后续我们项目中的标准做法。我们可以 src 目录里定义一个 jdbc.properties 文件:

url=jdbc:mysql:///learnjdbc
user=learn
password=learnpassword
driver=com.mysql.cj.jdbc.Driver
1
2
3
4

‍ 然后我们就可以读取配置文件并创建 Connection 对象了。并且配置文件的读取,通常只需要一次,我们可以使用 static 代码块:

static {
    // 读取数据库连接信息配置文件
    try {
        //1. 创建 Properties 集合类。
        Properties pro = new Properties();

        //2. 加载文件
        pro.load(new FileReader("src/jdbc.properties"));

        //3. 获取数据,赋值
        url = pro.getProperty("url");
        username = pro.getProperty("user");
        password = pro.getProperty("password");
        driver = pro.getProperty("driver");
        //4. 注册驱动
        Class.forName(driver);
    } catch (IOException | ClassNotFoundException e) {
        e.printStackTrace();
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

‍ 然后获取 Connection 对象的方法就写完了:

public static Connection getConnection() throws Exception{
    return DriverManager.getConnection(url, username, password);
}
1
2
3

‍

# 测试 JDBCUtils

接下来,我们测试下这个工具类。我们将上一篇博客中的 findAll 方法修改下:可以看到代码是有所简化的

package chapter2JDBC;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

/**
 * 测试 JDBCUtils 类
 */
public class JDBCDemo12Util {
    public static void main(String[] args) throws Exception{
        List<Student> list = findAll();
        for (Student stu : list) {
            System.out.println(stu.toString());
        }
    }

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

        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);
        }

        JDBCUtils.close(rs, statement, conn);
        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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51

‍

# 优化读取配置文件的代码

其实,上述我们读取配置文件的代码,如果配置文件路径有误,会引起一个错误:找不到 jdbc.properties。

虽然我们能写绝对路径,但完全不推荐这样写。

我们可以使用 ClassLoader 获取 src 路径下的文件。完整代码如下:

static {
    // 读取数据库连接信息配置文件
    //读取资源文件,获取值。
    try {
        //1. 创建 Properties 集合类。
        Properties pro = new Properties();

        //获取 src 路径下的文件的方式---> ClassLoader 类加载器
        ClassLoader classLoader = JDBCUtils.class.getClassLoader();
        URL res  = classLoader.getResource("jdbc.properties");
        String path = res.getPath();

        //2. 加载文件
        pro.load(new FileReader(path));

        //3. 获取数据,赋值
        url = pro.getProperty("url");
        user = pro.getProperty("user");
        password = pro.getProperty("password");
        driver = pro.getProperty("driver");
        //4. 注册驱动
        Class.forName(driver);
    } catch (IOException | ClassNotFoundException e) {
        e.printStackTrace();
    }
}
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

# 现成的工具类

上面我们自己写了一个 JDBC 的工具类,实际上目前业内有不少优秀的 JDBC 工具类,不用我们每次新建项目都写一次工具类,例如 Commons DbUtils (opens new window)。

Commons DbUtils 是 Apache 组织提供的一个开源 JDBC 工具类库,能让我们更简单的使用 JDBC。它是一个非常小的类包,花几分钟的时间就能掌握它的使用,感兴趣的读者可以自己搜索相关资料学习。

# 总结

使用了配置文件后,我们后续如果数据库信息有修改,是不用修改代码的,方便后续维护。

上次更新: 2025/6/3 09:31:54
ResultSet 结果封装为对象
JDBC 更新

← ResultSet 结果封装为对象 JDBC 更新→

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