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

    • Java
  • JavaWeb

  • Spring

  • 主流框架

  • SpringMVC

  • SpringBoot

  • Java并发

  • Java源码

  • JVM

  • 韩顺平

  • Java
  • 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。它是一个非常小的类包,花几分钟的时间就能掌握它的使用,感兴趣的读者可以自己搜索相关资料学习。

‍

‍

‍

# 总结

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

在GitHub上编辑此页 (opens new window)
上次更新: 2023/3/29 14:09:23
ResultSet结果封装为对象
JDBC更新

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

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