介绍一个稍微封装了jdbc的工具类org.apache.commons.dbutils,使用dbutils可以简化对数据库操作程序的开发。
API介绍
接下来通过实例的方式说一下dbutils的具体使用
添加jar包:commons-dbutils-1.7.jar
增、删、改
进行增、删、改操作,在这里(未使用数据源)只需传入数据库连接、sql、占位符值到update方法中即可完成操作。代码如下:
public static void main(String[] args) {//可以直接传入一个数据源,这里不适用连接池做实例QueryRunner queryRunner = new QueryRunner();Connection connection = null;//进行增、删、改操作,在这里只需传入数据库连接、sql、占位符值到update方法中即可完成操作try {connection = DBUtil.getConnection();//添加String sql1 = "INSERT INTO USER (uname,password) VALUES (? , ?)";Object []obj1= {"xiaopeng","123456"};int update1 = queryRunner.update(connection,sql1, obj1);System.out.println("添加成功:"+update1);//修改String sql2 = "UPDATE USER SET UNAME = ? WHERE ID = ?";Object []obj2 = {"xiaopeng",20005};int update2 = queryRunner.update(connection, sql2, obj2);System.out.println("修改成功:"+update2);//删除String sql3 = "DELETE FROM USER WHERE ID = ?";int update3 = queryRunner.update(connection,sql3,20004);System.out.println("删除成功:"+update3);} catch (SQLException e) {e.printStackTrace();}finally {if (connection != null) {try {connection.close();} catch (SQLException e) {e.printStackTrace();}}}
}
查询
使用dbutils进行查询时,需要了解如下几个类,他们用于将查询结果进行封装:
BeanListHandler:用于将结果集转成一个List集合,其泛型可用户自定义
public static void main(String[] args) {//可以直接传入一个数据源,这里不适用连接池做实例QueryRunner queryRunner = new QueryRunner();Connection connection = null;connection = DBUtil.getConnection();String sql = "SELECT UNAME ,PASSWORD FROM USER LIMIT 3";try {List<User> list = queryRunner.query(connection, sql, new BeanListHandler<>(User.class));System.out.println(list);} catch (SQLException e) {e.printStackTrace();}}
BeanHandler:用于将结果封装成一个实体,用于返回一个结果的场景
public static void main(String[] args) {//可以直接传入一个数据源,这里不适用连接池做实例QueryRunner queryRunner = new QueryRunner();Connection connection = null;connection = DBUtil.getConnection();String sql = "SELECT UNAME ,PASSWORD FROM USER WHERE ID = 4";try {//注意:这个地方一定要用实现类,否则容易报错User user = queryRunner.query(connection, sql, new BeanHandler<>(User.class));System.out.println(user);} catch (SQLException e) {e.printStackTrace();}
}
MapHandler:用于将返回的一个结果集封装成一个Map集合,用于返回一条结果集的场景
public static void main(String[] args) {//可以直接传入一个数据源,这里不适用连接池做实例QueryRunner queryRunner = new QueryRunner();Connection connection = null;connection = DBUtil.getConnection();String sql = "SELECT UNAME ,PASSWORD FROM USER WHERE ID = 4";try {Map<String, Object> map = queryRunner.query(connection, sql, new MapHandler());System.out.println(map);} catch (SQLException e) {e.printStackTrace();}
}
MapListHandler:用于将返回的结果集封装成一个List集合,每一条记录信息封装到一个Map集合中
public static void main(String[] args) {//可以直接传入一个数据源,这里不适用连接池做实例QueryRunner queryRunner = new QueryRunner();Connection connection = null;connection = DBUtil.getConnection();String sql = "SELECT UNAME ,PASSWORD FROM USER LIMIT 10";try {List<Map<String, Object>> list = queryRunner.query(connection, sql, new MapListHandler());System.out.println(list);} catch (SQLException e) {e.printStackTrace();}
}
基本实现原理:这几个封装类都实现了ResultSetHandler接口,然后根据不同的类型对应实现ResultSetHandler接口中的handle方法以实现结果集的封装,封装时最终都调用的是类BeanProcessor中的方法,具体封装过程可看源码
public interface ResultSetHandler<T> {T handle(ResultSet rs) throws SQLException;}