摘要:本文学习了如何使用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语句。
构造方法:
java1 2 3 4
| public QueryRunner();
public QueryRunner(DataSource ds);
|
常用方法:
java1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| public int update(Connection conn, String sql, Object... params) throws SQLException;
public int update(String sql, Object... params) throws SQLException;
public int[] batch(Connection conn, String sql, Object[][] params) throws SQLException;
public int[] batch(String sql, Object[][] params) throws SQLException;
public <T> T query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params) throws SQLException;
public <T> T query(String sql, ResultSetHandler<T> rsh, Object... params) throws SQLException;
public int execute(Connection conn, String sql, Object... params) throws SQLException;
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表并插入数据:
sql1 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类:
java1 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 执行新增操作
示例:
java1 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 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 执行修改操作
示例:
java1 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 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 执行删除操作
示例:
java1 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 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 执行单个查询操作
示例:
java1 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 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 执行多行查询操作
示例:
java1 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 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 执行聚集查询操作
示例:
java1 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 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 执行批量操作
示例:
java1 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 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)); }
|
条