一、Apache—DBUtils
1.commons-dbutils是Apache组织提供的一个开源JDBC工具类库,对JDBC封装使用dbutlis可以很大简化jdbc编码工作量。DbUtils类
2.QueryRunner类:封装了SQL的执行,线程安全,可以实现增,删,改,查,批处理。
3.使用QueryRunner类实现查询。
4.ResultSetHandler接口:接口用于处理java.sql.ResultSet,将数据按要求转换成另一种形式。
ArrayHandler:把结果集中的第一行数据转成对象数组
ArrayListHandler:把结果集中的每一行数据都转成一个数组,再存放到list中
BeanHandler:将结果集中的每一行数据封装到一个对应的JavaBean实例中,存放到List里
ColumnListHandler:将结果集中某一列的数据存放到List中
KeyedHandler(name):将结果集中的每行数据都封装到Map里,再把这些map再存放到一个map里,其key为指定key
MapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值
MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List。
二、ApDBUtils源码分析
ApDBUtils 的jar包:https://mvnrepository.com/artifact/commons-dbutils/commons-dbutils/1.3
package com.jun.jdbc.datasource;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.junit.Test;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
public class DBUtilsTest {
//使用apache-DBUtils工具类+druid完成对表crud操作
@Test
public void queryMany() throws SQLException {//返回结果是多行的情况
//得到连接
Connection connection = JDBCUtilsDruid.getConnection();
//导入DBUtils的jar包,使用DBUtils类和接口
//创建QueryRunner
QueryRunner queryRunner = new QueryRunner();
//执行相关的方法,返回ArrayList结果集
//String sql ="select * from actor where id>=?";
String sql ="select name from actor where id>=?";
//1.query方法就是执行sql语句,得到resultest --封装到 -->ArrayList集合中
//2.返回集合
//3.connection:连接
//4.sql:执行的sql语句
//5.new BeanListHandler<>(Actor.class):将resultset ->Actor 对象 ->封装到ArrayList
//底层使用反射机制获取Actor类的属性,然后进行封装
//6.1是给?赋值,可以有多个值,因为可变参数Object...params
//7.底层得到将resultset,在query关闭,关闭preparedStatement
/*源码分析:
public <T> T query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params) throws SQLException {
PreparedStatement stmt = null;//定义PreparedStatement
ResultSet rs = null;//接收返回的ResultSet
Object result = null;//返回ArrayList
try {
stmt = this.prepareStatement(conn, sql);//创建PreparedStatement
this.fillStatement(stmt, params);//对sql进行?赋值
rs = this.wrap(stmt.executeQuery());//执行sql,返回resultset
result = rsh.handle(rs);//返回resultset -->ArrayList(result)(使用反射)
} catch (SQLException var33) {
this.rethrow(var33, sql, params);
} finally {
try {
this.close(rs);//关闭resultset
} finally {
this.close((Statement)stmt);//关闭preparedStatement
}
}
return result;
}
*/
List<Actor> list = queryRunner.query(connection, sql, new BeanListHandler<>(Actor.class), 1);
for (Actor actor:list) {
System.out.println(actor);
}
//关闭连接
JDBCUtilsDruid.close(null,null,connection);
}
}
三、ApDBUtils查询2
//使用apache-DBUtils工具类+druid完成 返回的结果是单行记录
@Test
public void QuerySingle() throws SQLException {
//得到连接
Connection connection = JDBCUtilsDruid.getConnection();
//导入DBUtils的jar包,使用DBUtils类和接口
//创建QueryRunner
QueryRunner queryRunner = new QueryRunner();
//执行相关的方法,返回单个对象
String sql ="select * from actor where id>=?";
//返回单个记录<-->单个对象,使用的 Hander 是BeanHandler
Actor actor = queryRunner.query(connection, sql, new BeanHandler<>(Actor.class), 2);
System.out.println(actor);
//关闭连接
JDBCUtilsDruid.close(null,null,connection);
}
//使用apache-DBUtils工具类+druid完成 返回的结果是单行单列 -返回就是object
@Test
public void Scalar() throws SQLException {
//得到连接
Connection connection = JDBCUtilsDruid.getConnection();
//导入DBUtils的jar包,使用DBUtils类和接口
//创建QueryRunner
QueryRunner queryRunner = new QueryRunner();
//执行相关的方法,返回单行单列 ,就是Object
String sql ="select name from actor where id>=?";
//因为返回的是一个对像,使用的handler 就是ScalarHandler
Object o = queryRunner.query(connection, sql, new ScalarHandler(), 2);
System.out.println(o);
//关闭连接
JDBCUtilsDruid.close(null,null,connection);
}
}
四、ApDBUtils DML
//使用apache-DBUtils工具类+druid完成 DML(update,insert,delete)
@Test
public void DML() throws SQLException {
//得到连接
Connection connection = JDBCUtilsDruid.getConnection();
//导入DBUtils的jar包,使用DBUtils类和接口
//创建QueryRunner
QueryRunner queryRunner = new QueryRunner();
//sql语句完成update,insert,delete
//String sql="update actor set name = ? where id =?";
//String sql = "insert into actor values(null,?,?,?,?)";
String sql = "delete from actor where id=?";
//执行dml 操作 queryRunner.update()
//返回的值是受影响的行数(affected:受影响)
//int affectedRow = queryRunner.update(connection, sql, "小鱼儿", 2);
//int affectedRow = queryRunner.update(connection, sql, "花无缺","男","1744-5-6","123");
int affectedRow = queryRunner.update(connection, sql, 2);
System.out.println(affectedRow>0?"执行成功":"执行没有影响到表");
//关闭连接
JDBCUtilsDruid.close(null,null,connection);
}
}