15. jdbc 工具包-dbUtils

it2022-05-05  164

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(){ // 每个测试用例执行前,先获取数据库连接, 并创建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); }

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}; // 执行批量删除sql, 返回每条sql的执行结果 int[] cntArray = queryRunner.batch(connection, sql, params); for (int i = 0; i < cntArray.length; i++) { System.out.println("第" + i + "条sql执行影响行数:" + cntArray[i]); } }

2.6 查询操作

// 测试查询: 返回单个bean, 使用BeanHandler解析器 @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); } // 测试查询: 返回bean集合, 使用BeanListHandler解析器 @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); } // 测试查询: 返回单个bean属性和值映射的map, 使用MapHandler解析器 @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())); } // 测试查询: 返回bean属性和值映射的map组成的集合, 使用MapListHandler解析器 @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())); } } // 测试查询: 返回单个字段, 使用ScalarHandler解析器 @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()); } // 测试查询: 返回单个字段的多条记录, 使用ColumnListHandler解析器 @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); }

最新回复(0)