介绍一个稍微封装了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;
}