JDBC 工具类
# 7.JDBC 工具类
我们之前学习和使用 JDBC 查询的时候,可以发现有非常非常多的重复代码
- 获取 Connection 对象
- 使用完后要逐个 close 对象
我们之前练习的这么多类中,每个类都有很多的重复代码。
# 定义工具类 JDBCUtils
为了解决上述问题,我们可以定义一个工具类,抽取公用的代码:
- 注册驱动的代码
- 获取连接的代码
- 抽取方法释放资源
我们先从简单的释放资源的代码开始:
# 释放资源的代码
分两种情况:
- 释放 Connection 对象、Statement 对象
- 释放 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();
}
}
}
}
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);
}
2
3
但其实,这样和封装前有什么区别呢:甚至不如不封装
DriverManager.getConnection(JDBC_URL, JDBC_USER, JDBC_PASSWORD);
并且,为了安全起见,数据库密码可能会定期更换的,如果为此每次都修改代码中定义的密码字段,非常麻烦,怎么办呢?
我们可以使用配置文件!这种方式也是后续我们项目中的标准做法。我们可以 src 目录里定义一个 jdbc.properties 文件:
url=jdbc:mysql:///learnjdbc
user=learn
password=learnpassword
driver=com.mysql.cj.jdbc.Driver
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();
}
}
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);
}
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;
}
}
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();
}
}
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。它是一个非常小的类包,花几分钟的时间就能掌握它的使用,感兴趣的读者可以自己搜索相关资料学习。
# 总结
使用了配置文件后,我们后续如果数据库信息有修改,是不用修改代码的,方便后续维护。