jdbc 系列文章列表, 请查看目录: 《jdbc学习笔记》
1. DbUtils 简介
DbUtils 是Apache 组织下的一个jdbc 操作的工具包, 更新截止于2017年7月. 虽然说笔者认为这个工具包封装的API 并不是太好用, 不能达到笔者的预期, 但是笔者认为还是值得花点儿时间学习和研究一下的. 原因有两个方面: 一方面是可能工作项目中有人使用了DbUtis工具包, 另一方面是可以学习DbUtilsAPI的封装方法, 以及源代码, 自己开发一个适合自己开发习惯的工具包.
1.1 QueryRunner核心API
- QueryRunner 是DbUtils 的查询器, 用于执行增删改查sql
- QueryRunner 的API 有两类, 一种是包含Connection 形参的, 另一种是不包含的. 不包含的API 以废弃, 所以只需要关注包含Connection的API 即可.
- QueryRunner 的常用API 列表:
方法签名 | 方法描述 |
---|---|
public T insert(Connection conn, String sql, ResultSetHandler rsh, Object… params) | 执行插入sql, 支持返回自增主键 |
public int update(Connection conn, String sql, Object param) | 执行/删除更新sql |
public T query(Connection conn, String sql, ResultSetHandler rsh, Object… params) | 执行查询sql, 支持结果集封装, 返回多种格式的返回结果 |
public T insertBatch(Connection conn, String sql, ResultSetHandler rsh, Object[][] params) | 执行批量插入, 支持返回批量自增主键 |
public int[] batch(Connection conn, String sql, Object[][] params) | 执行批量更新/删除sql, 返回每条sql执行结果影响的记录数量 |
public List execute(Connection conn, String sql, ResultSetHandler rsh, Object… params) | 执行存储过程等非CRUD sql |
1.2 结果解析器
ResultSetHandler 是DbUtils 用于解析sql查询结果ResultSet的接口, DbUtils提供了多种实现类, 用于处理多种返回结果.
实现类 | 描述 | 缺点 |
---|---|---|
ScalarHandler | 返回单行记录, 每行记录只解析第一个字段 | 返回类型根据字段类型不同而不同, 不能根据代码做自动转换 |
ColumnListHandler | 返回多行记录, 为每行记录采用ColumnListHandler 解析策略 | 同ColumnListHandler |
BeanHandler | 返回单行记录, 将每行记录转换为javabean. | 列名和java属性名必须完全一致,一一对应. 不支持别名一致 |
BeanListHandler | 返回多行记录, 为每行记录采用BeanHandler策略解析为单独的javabean | 同BeanHandler |
MapHandler | 返回单行记录, 将每行记录转换为由列名和值组成的键值对的map | key为列名, 不支持别名 |
MapListHandler | 返回多行记录, 为每行记录采用MapHandler策略解析为map对象 | 同MapListHandler |
2. 测试
为了简单测试DbUtils的API, 笔者创建一张简单的表来测试. JavaBean 中属性和字段名一一对应!
字段名 | 类型 | 描述 |
---|---|---|
id | int | 主键自增 |
name | varchar(120) | 用户名 |
passowrd | varchar(120) | 密码 |
2.1 获取数据库链接
- 由于每个测试用例都需要获取数据库连接, 因此抽出来方法
- 具体获取数据库连接方式多种多样, 自行选择即可
private Connection connection;
private QueryRunner queryRunner;
@Before
public void setUp(){
// 每个测试用例执行前,先获取数据库连接, 并创建queryRunner对象
connection = DbConnUtil.getConnection();
queryRunner = new QueryRunner();
}
2.2 插入操作
@Test
public void test_insert() throws Exception {
String sql = "insert into t_user(name, password) values(?,?)";
long autoId = queryRunner.insert(connection, sql, new ScalarHandler<>(), "zhangsan", "123456");
System.out.println("自增id:" + autoId)