jdbc 系列文章列表, 请查看目录: 《jdbc学习笔记》
1. DbUtils 简介
DbUtils 是Apache 组织下的一个jdbc 操作的工具包, 更新截止于2017年7月. 虽然说笔者认为这个工具包封装的API 并不是太好用, 不能达到笔者的预期, 但是笔者认为还是值得花点儿时间学习和研究一下的. 原因有两个方面: 一方面是可能工作项目中有人使用了DbUtis工具包, 另一方面是可以学习DbUtilsAPI的封装方法, 以及源代码, 自己开发一个适合自己开发习惯的工具包.
1.1 QueryRunner核心API
QueryRunner 是DbUtils 的查询器, 用于执行增删改查sqlQueryRunner 的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)执行/删除更新sqlpublic 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 解析策略同ColumnListHandlerBeanHandler返回单行记录, 将每行记录转换为javabean.列名和java属性名必须完全一致,一一对应. 不支持别名一致BeanListHandler返回多行记录, 为每行记录采用BeanHandler策略解析为单独的javabean同BeanHandlerMapHandler返回单行记录, 将每行记录转换为由列名和值组成的键值对的mapkey为列名, 不支持别名MapListHandler返回多行记录, 为每行记录采用MapHandler策略解析为map对象同MapListHandler
2. 测试
为了简单测试DbUtils的API, 笔者创建一张简单的表来测试. JavaBean 中属性和字段名一一对应!
字段名类型描述
idint主键自增namevarchar(120)用户名passowrdvarchar(120)密码
2.1 获取数据库链接
由于每个测试用例都需要获取数据库连接, 因此抽出来方法具体获取数据库连接方式多种多样, 自行选择即可
private Connection connection
;
private QueryRunner queryRunner
;
@Before
public void setUp(){
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
);
}
2.3 删除操作
@Test
public void test_delete() throws Exception
{
String sql
= "delete from t_user where id = ?";
int cnt
= queryRunner
.update(connection
, sql
,1);
System
.out
.println("删除数量:" + cnt
);
}
2.4 修改操作
public void test_update() throws Exception
{
String sql
= "update t_user set name = ? , password = ? where id = ?";
int cnt
= queryRunner
.update(connection
, sql
, "lisi", "lisi", 14);
System
.out
.println("更新数量:" + cnt
);
}
2.5 批量操作
@Test
public void test_batchInsert() throws SQLException
{
String sql
= "insert into t_user(name, password) values(?,?)";
Object
[][] params
= new Object[3][2];
params
[0] = new Object[]{"zhangsan-01","123456"};
params
[1] = new Object[]{"zhangsan-02","234567"};
params
[2] = new Object[]{"zhangsan-03","345678"};
List
<Object> idList
= queryRunner
.insertBatch(connection
, sql
, new ColumnListHandler<>(), params
);
System
.out
.println(idList
);
}
@Test
public void test_batchUpdate() throws SQLException
{
String sql
= "delete from t_user where id = ?";
Object
[][] params
= new Object[3][];
params
[0] = new Object[]{21};
params
[1] = new Object[]{22};
params
[2] = new Object[]{23};
int[] cntArray
= queryRunner
.batch(connection
, sql
, params
);
for (int i
= 0; i
< cntArray
.length
; i
++) {
System
.out
.println("第" + i
+ "条sql执行影响行数:" + cntArray
[i
]);
}
}
2.6 查询操作
@Test
public void test_bean() throws Exception
{
String sql
= "select id, name, password from t_user where id = ?";
UserPO userPO
= queryRunner
.query(connection
, sql
, new BeanHandler<>(UserPO
.class), 14);
System
.out
.println(userPO
);
}
@Test
public void test_beanList() throws SQLException
{
String sql
= "select id, name, password from t_user where id in(?,?)";
List
<UserPO> userPO
= queryRunner
.query(connection
, sql
, new BeanListHandler<>(UserPO
.class), 14, 15);
System
.out
.println(userPO
);
}
@Test
public void test_map() throws SQLException
{
String sql
= "select id dId, name, password from t_user where id = ?";
Map
<String, Object> map
= queryRunner
.query(connection
, sql
, new MapHandler(), 14);
map
.entrySet().forEach(entry
-> System
.out
.println(entry
.getKey() + ":" + entry
.getValue()));
}
@Test
public void test_ListMap() throws SQLException
{
String sql
= "select id dId, name, password from t_user where id in(?,?)";
List
<Map
<String, Object>> list
= queryRunner
.query(connection
, sql
, new MapListHandler(), 15, 16);
for (Map
<String, Object> map
: list
) {
System
.out
.println("***********************");
map
.entrySet().forEach(entry
-> System
.out
.println(entry
.getKey() + ":" + entry
.getValue()));
}
}
@Test
public void test_column() throws SQLException
{
String sql
= "select id||name||password from t_user where id = ?";
Object object
= queryRunner
.query(connection
, sql
, new ScalarHandler<>(), 5);
System
.out
.println(object
+ ":" + object
.getClass());
}
@Test
public void test_columnList() throws SQLException
{
String sql
= "select name from t_user where id in (?, ?)";
List
<Object> list
= queryRunner
.query(connection
, sql
, new ColumnListHandler<>(), 15, 16);
list
.forEach(System
.out
::println
);
}