抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

摘要:本文学习了如何使用DBUtils工具类库简化数据库操作。

环境

Windows 10 企业版 LTSC 21H2
Java 1.8
MySQL 5.7.40

1 简介

1.1 背景

虽然连接池可以解决连接管理的问题,但在实际开发中,每次进行数据库操作都需要写大量的重复代码,并且需要手动将结果集转换为JavaBean对象,非常繁琐。

Apache组织提供的DBUtils(Database Utilities)是一个开源的JDBC工具库,目的是简化JDBC代码的编写,减少重复代码,使开发效率大幅提升。

1.2 特点

DBUtils有以下特点:

  • 简化JDBC操作,无需手动设置参数和遍历结果集。
  • 自动资源管理,自动关闭Connection、Statement、ResultSet等资源。
  • 提供QueryRunner类,封装了常见的数据库操作,如查询、更新等。
  • 提供BeanHandler、BeanListHandler等结果处理器,自动将结果集转换为JavaBean对象。
  • 轻量级库,不依赖其他第三方库。

2 核心组件

2.1 QueryRunner

QueryRunner类是执行器,用于执行SQL语句。

构造方法:

java
1
2
3
4
// 执行SQL时手动传入连接
public QueryRunner();
// 执行SQL时自动获取连接
public QueryRunner(DataSource ds);

常用方法:

java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 执行DML语句,进行增删改操作,手动传入连接,返回受影响的行数
public int update(Connection conn, String sql, Object... params) throws SQLException;
// 执行DML语句,进行增删改操作,自动获取连接,返回受影响的行数
public int update(String sql, Object... params) throws SQLException;
// 批量执行DML语句,进行增删改操作,手动传入连接,返回受影响的行数
public int[] batch(Connection conn, String sql, Object[][] params) throws SQLException;
// 批量执行DML语句,进行增删改操作,自动获取连接,返回受影响的行数
public int[] batch(String sql, Object[][] params) throws SQLException;
// 执行DQL语句,进行查询操作,手动传入连接,返回查询结果
public <T> T query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params) throws SQLException;
// 执行DQL语句,进行查询操作,自动获取连接,返回查询结果
public <T> T query(String sql, ResultSetHandler<T> rsh, Object... params) throws SQLException;
// 执行DDL语句,进行表结构修改,手动传入连接,返回受影响的行数
public int execute(Connection conn, String sql, Object... params) throws SQLException;
// 执行DDL语句,进行表结构修改,自动获取连接,返回受影响的行数
public int execute(String sql, Object... params) throws SQLException;

2.2 ResultSetHandler

ResultSetHandler是结果集处理器,用于将ResultSet转换为所需的数据结构。

常用的处理器类:

  • BeanHandler:将结果集的单行数据转换为JavaBean对象。
  • BeanListHandler:将结果集的多行数据转换为JavaBean对象列表。
  • MapHandler:将结果集的单行数据转换为Map对象。
  • MapListHandler:将结果集的多行数据转换为Map对象列表。
  • ArrayHandler:将结果集的单行数据转换为Object[]数组。
  • ArrayListHandler:将结果集的多行数据转换为Object[]数组列表。
  • ScalarHandler:提取结果集的单个值。

3 简单使用

3.1 导入Jar包

下载Jar包:

将下载的commons-dbutils-1.7.jar文件复制到lib目录。

3.2 准备数据表

创建user表并插入数据:

sql
1
2
3
4
5
6
7
8
9
CREATE TABLE `user`  (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
`username` varchar(255) COMMENT '用户名称',
`password` varchar(255) COMMENT '用户密码',
`create_time` datetime COMMENT '创建时间',
`update_time` datetime COMMENT '修改时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB COMMENT = '用户表';
INSERT INTO `user` VALUES (1, '张三', '123456', '2020-12-17 16:35:23', '2020-12-17 16:35:23');

3.3 创建JavaBean类

创建与user表对应的JavaBean类:

java
1
2
3
4
5
6
7
8
public class User {
private Integer id;
private String username;
private String password;
private LocalDateTime createTime;
private LocalDateTime updateTime;
// ...
}

3.4 执行操作

3.4.1 执行新增操作

示例:

java
1
2
3
4
5
6
7
8
9
10
11
12
13
public static void main(String[] args) throws Exception {
// 读取配置文件
Properties pros = new Properties();
pros.load(JDBCTest.class.getClassLoader().getResourceAsStream("jdbc.properties"));
// 创建连接池
DataSource dataSource = DruidDataSourceFactory.createDataSource(pros);
// 创建QueryRunner
QueryRunner qr = new QueryRunner(dataSource);
// 执行新增操作
String sql = "insert into user values (null, ?, ?, now(), now())";
int insert = qr.update(sql, "李四", "123456");
System.out.println("insert=" + insert);
}

3.4.2 执行修改操作

示例:

java
1
2
3
4
5
6
7
8
9
10
11
12
13
public static void main(String[] args) throws Exception {
// 读取配置文件
Properties pros = new Properties();
pros.load(JDBCTest.class.getClassLoader().getResourceAsStream("jdbc.properties"));
// 创建连接池
DataSource dataSource = DruidDataSourceFactory.createDataSource(pros);
// 创建QueryRunner
QueryRunner qr = new QueryRunner(dataSource);
// 执行修改操作
String sql = "update user set password = ? where id = ?";
int update = qr.update(sql, "666666", 2);
System.out.println("update=" + update);
}

3.4.3 执行删除操作

示例:

java
1
2
3
4
5
6
7
8
9
10
11
12
13
public static void main(String[] args) throws Exception {
// 读取配置文件
Properties pros = new Properties();
pros.load(JDBCTest.class.getClassLoader().getResourceAsStream("jdbc.properties"));
// 创建连接池
DataSource dataSource = DruidDataSourceFactory.createDataSource(pros);
// 创建QueryRunner
QueryRunner qr = new QueryRunner(dataSource);
// 执行删除操作
String sql = "delete from user where id = ?";
int delete = qr.update(sql, 2);
System.out.println("delete=" + delete);
}

3.4.4 执行单个查询操作

示例:

java
1
2
3
4
5
6
7
8
9
10
11
12
13
public static void main(String[] args) throws Exception {
// 读取配置文件
Properties pros = new Properties();
pros.load(JDBCTest.class.getClassLoader().getResourceAsStream("jdbc.properties"));
// 创建连接池
DataSource dataSource = DruidDataSourceFactory.createDataSource(pros);
// 创建QueryRunner
QueryRunner qr = new QueryRunner(dataSource);
// 执行查询操作
String sql = "select * from user where id = ?";
User user = qr.query(sql, new BeanHandler<>(User.class), 1);
System.out.println(user);
}

3.4.5 执行多行查询操作

示例:

java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public static void main(String[] args) throws Exception {
// 读取配置文件
Properties pros = new Properties();
pros.load(JDBCTest.class.getClassLoader().getResourceAsStream("jdbc.properties"));
// 创建连接池
DataSource dataSource = DruidDataSourceFactory.createDataSource(pros);
// 创建QueryRunner
QueryRunner qr = new QueryRunner(dataSource);
// 执行查询操作
String sql = "select * from user";
List<User> users = qr.query(sql, new BeanListHandler<>(User.class));
for (User user : users) {
System.out.println(user);
}
}

3.4.6 执行聚集查询操作

示例:

java
1
2
3
4
5
6
7
8
9
10
11
12
13
public static void main(String[] args) throws Exception {
// 读取配置文件
Properties pros = new Properties();
pros.load(JDBCTest.class.getClassLoader().getResourceAsStream("jdbc.properties"));
// 创建连接池
DataSource dataSource = DruidDataSourceFactory.createDataSource(pros);
// 创建QueryRunner
QueryRunner qr = new QueryRunner(dataSource);
// 执行查询操作
String sql = "select count(*) from user";
Long count = qr.query(sql, new ScalarHandler<>());
System.out.println("count=" + count);
}

3.4.7 执行批量操作

示例:

java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public static void main(String[] args) throws Exception {
// 读取配置文件
Properties pros = new Properties();
pros.load(JDBCTest.class.getClassLoader().getResourceAsStream("jdbc.properties"));
// 创建连接池
DataSource dataSource = DruidDataSourceFactory.createDataSource(pros);
// 创建QueryRunner
QueryRunner qr = new QueryRunner(dataSource);
// 执行批量操作
String sql = "insert into user values (null, ?, ?, now(), now())";
Object[][] params = new Object[][] {
{"李四", "123456"},
{"王五", "123456"},
{"赵六", "123456"}
};
int[] results = qr.batch(sql, params);
System.out.println("batch results: " + Arrays.toString(results));
}

评论