10.25JDBC之Apache-DBUtils实现CRUD操作
Apache-DBUtils简介
什么是Apache-DBUtils?
commons-dbutils
是Apache
组织提供的一个开源的JDBC
工具类库
API
介绍
-
org.apache.commons.dbutils.QueryRunner
-
org.apache.commons.dbutils.ResultSetHandler
-
org.apache.commons.dbutils.DbUtils
工具类
使用方式
导入依赖
<!--dbutils依赖-->
<dependency>
<groupId>commons-dbutils</groupId>
<artifactId>commons-dbutils</artifactId>
<version>1.7</version>
</dependency>
主要使用方法:
-
QueryRunner
类下封装的方法
插入一条数据:
@Test
public void testInsert() throws Exception {
Connection conn = null;
try {
//新建对象引用
QueryRunner runner = new QueryRunner();
//获取一个连接
DruidTest dt = new DruidTest();
conn = dt.getConnection();
String sql = "insert into customers(name, email, birthday) values(?, ?, ?);";
//调用方法
/*
传参:
连接
sql
object对象
*/
int insertCount = runner.update(conn, sql, "蔡徐坤", "cai@163.com", "1999-09-09");
System.out.println("添加了" + insertCount + "记录!");
}catch (Exception e){
e.printStackTrace();
}finally {
//关闭练级
JDBCUtils.closeResource(conn, null);
}
}
返回单个结果的封装方法:
//测试查询操作,使用dbutils
/*
使用BeanHandler,是ResultSet接口的实现类。用于封装表中的一条记录
*/
@Test
public void testQuery1() {
Connection conn = null;
try {
QueryRunner runner = new QueryRunner();
//调用query当中的结果集处理器方法
/*
参数:
连接
sql
结果集处理器--->这是一个接口,需要传接口的具体实现类的实例。结果集返回数据这一块通过接口进行处理。因为返回的情况是多样的。为了应对不同的结果所以定义一个接口作为标准
object对象
*/
conn = JDBCUtils.getConnection();
String sql = "select id, name, birthday from customers where id = ?;";
/*BeanHandler是结果集处理器的接口实现类--->没有空参构造器*/
BeanHandler<Customer> handler = new BeanHandler<>(Customer.class);
Customer customer = runner.query(conn, sql, handler, 23);
System.out.println(customer);
}catch (Exception e) {
e.printStackTrace();
}finally {
//关闭资源
JDBCUtils.closeResource(conn, null);
}
}
使用List
封装返回的多个结果对象:
//测试查询,使用dbutils封装多条返回记录
/*
BeanListHandler,是一个DBUtils的实现类。用于封装多条记录的返回结果
*/
@Test
public void testQuery2() throws SQLException {
Connection conn = null;
try {
QueryRunner runner = new QueryRunner();
conn = JDBCUtils.getConnection();
String sql = "select id, name, birthday from customers where id < ?;";
/*BeanListHandler是结果集处理器的接口实现类--->封装返回的多条记录*/
BeanListHandler<Customer> handler = new BeanListHandler<>(Customer.class);
List<Customer> list = runner.query(conn, sql, handler, 23);
//打印list
list.forEach(System.out::println);
}catch (Exception e) {
e.printStackTrace();
}finally {
//关闭资源
JDBCUtils.closeResource(conn, null);
}
}
使用Map
封装返回的单个结果对象:
//返回一个Map
/*
MapHandler,封装返回的也是一条纪律
返回的对象是以一个map的方式来呈现
将字段与值作为map中的key和value
*/
@Test
public void testQuery3() {
Connection conn = null;
try {
QueryRunner runner = new QueryRunner();
//调用方法传入参数
/*
连接
sql
结果集处理器
object对象
*/
conn = JDBCUtils.getConnection();
String sql = "select id, name, email, birthday from customers where id = ?;";
/*使用maphandler处理结果集*/
MapHandler handler = new MapHandler();
Map<String, Object> map = runner.query(conn, sql, handler, 23);
System.out.println(map);
}catch (Exception e) {
e.printStackTrace();
}finally {
//关闭资源
JDBCUtils.closeResource(conn, null);
}
}
使用MapList
封装返回的多个对象:
//MapListHandler
/*
以map德形式返回字段和值
返回多个结果集
*/
@Test
public void testQuery4() {
Connection conn = null;
try {
QueryRunner runner = new QueryRunner();
conn = JDBCUtils.getConnection();
String sql = "select id, name, email, birthday from customers where id < ?;";
/*使用MapListHandler作为结果集处理器*/
MapListHandler handler = new MapListHandler();
List<Map<String, Object>> list = runner.query(conn, sql, handler, 23);
//循环打印list
list.forEach(System.out::println);
}catch (Exception e) {
e.printStackTrace();
}finally {
//关闭资源
JDBCUtils.closeResource(conn, null);
}
}
使用MapListHandler
对返回的多个结果集对象进行封装:
//MapListHandler
/*
以map德形式返回字段和值
返回多个结果集
每一条记录对应map中的key和value
*/
@Test
public void testQuery4() {
Connection conn = null;
try {
QueryRunner runner = new QueryRunner();
conn = JDBCUtils.getConnection();
String sql = "select id, name, email, birthday from customers where id < ?;";
/*使用MapListHandler作为结果集处理器*/
MapListHandler handler = new MapListHandler();
List<Map<String, Object>> list = runner.query(conn, sql, handler, 23);
//循环打印list
list.forEach(System.out::println);
}catch (Exception e) {
e.printStackTrace();
}finally {
//关闭资源
JDBCUtils.closeResource(conn, null);
}
}
使用sql
的内置函数进行查询操作:
//使用sql函数进行查询操作返回封装的结果集
@Test
public void testQuery5() {
Connection conn = null;
try {
QueryRunner runner = new QueryRunner();
//获取连接
conn = JDBCUtils.getConnection();
//书写sql
String sql = "select count(*) from customers;";
//选择结果处理器
/*使用salarhandler*/
ScalarHandler handler = new ScalarHandler();
//调用方法传入指定参数
Long count = (Long) runner.query(conn, sql, handler);
System.out.println(count);
}catch (Exception e){
e.printStackTrace();
}finally {
//关闭资源
JDBCUtils.closeResource(conn, null);
}
}
data
类型:
//使用sql函数进行查询data类型的操作
@Test
public void testQuery6() {
Connection conn = null;
try {
QueryRunner runner = new QueryRunner();
//获取连接
conn = JDBCUtils.getConnection();
//书写sql
String sql = "select max(birthday) from customers;";
//选择结果处理器--->该类有空参构造器
ScalarHandler handler = new ScalarHandler();
//调用runner下的方法
Data maxBirth = (Data) runner.query(conn, sql, handler);
System.out.println(maxBirth);
}catch (Exception e) {
e.printStackTrace();
}finally {
//关闭资源
JDBCUtils.closeResource(conn, null);
}
}
自定义DBUtils实现类进行查询操作
因为上诉的一些方法都是再Bean
类下实现的方法。这些类统一实现了接口:Interface ResultSetHandler<T>
这个泛型接口。
所以可以通过实现该接口的方式自定义查询的实现类和方法
具体实现类:
/*
自定义一个ResultSetHandler的实现类
*/
@Test
public void testQuery7() {
Connection conn = null;
try {
QueryRunner runner = new QueryRunner();
//获取连接
conn = JDBCUtils.getConnection();
//书写sql
String sql = "select max(birthday) from customers;";
//自定义一个匿名的结果集实现类--->在new的对象引用提供接口重写的方法
/*
提供匿名实现类的时候右边的泛型不能省略
*/
ResultSetHandler<Customer> handler = new ResultSetHandler<Customer>(){
//该方法返回的对象作为下面runner.query的返回值
@Override
public Customer handle(ResultSet resultSet) throws SQLException {
System.out.println("啥也不是!");
// return null;
//返回一个固定的结果集
// return new Customer(18, "帅气逼人", "Lucifer@163.com", new Date(655354523L));
//BeanHandler实际的结果集执行的逻辑是
if (resultSet.next()){
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
String email = resultSet.getString("email");
Date birth = resultSet.getDate("birthday");
Customer customer = new Customer(id, name, email, birth);
return customer;
}
return null;
}
};
//使用自定义的查询语句进行查询
/*
上述handle方法的返回值就是query的返回值
*/
Customer customer = runner.query(conn, sql, handler, 23);
System.out.println(customer);
}catch (Exception e) {
e.printStackTrace();
}finally {
//关闭资源
JDBCUtils.closeResource(conn, null);
}
}
调用第三方工具类提供的关闭资源的方法
关闭资源:
/*调用第三方sdk提供的工具类下的方法实现资源的关闭*/
public static void closeResource2(Connection conn, PreparedStatement ps, ResultSet rs) {
try {
DbUtils.close(conn);
}catch (SQLException e) {
e.printStackTrace();
}
try {
DbUtils.close(ps);
}catch (SQLException e) {
e.printStackTrace();
}
try {
DbUtils.close(rs);
}catch (SQLException e) {
e.printStackTrace();
}
}
/*调用第三方sdk提供的工具类,方法中处理异常*/
public static void closeResource3(Connection conn, PreparedStatement ps, ResultSet rs) {
DbUtils.closeQuietly(conn);
DbUtils.closeQuietly(ps);
DbUtils.closeQuietly(rs);
}