一、简介
commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的封装使用dbutils能极大简化idbc编码的工作量。
下载链接
DbUtils – Download Apache Commons DbUtils
二、常用类
2.1QueryRunner类
该类封装了SQL的执行,是线程安全的。可以实现增、删、改、查、批处理。其常用的两个方法:
query():查询
update():增删改都用update()
2.2 ResultSetHandler接口及其实现类
该接口用于处理 java.sql.ResultSet,将数据按要求转换为另一种形式。
其实现类包括如下:
【ArrayHandler】: 把结果集中的第一行数据转成对象数组
【ArrayListHandler】: 把结果集中的每一行数据都转成一个数组,再存放到List中。
【BeanHandler】 : 将结果集中的第一行数据封装到一个对应的JavaBean实例中
【BeanListHandler】: 将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。
【columnListHandler】: 将结果集中某一列的数据存放到List中
【KevedHandername】:将结果集中的每行数据都封装到Map里,再把这些map再存到一个map里,其key为指定的
【MapHandler】:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。
【MapListHandler】: 将结果集中的每一行数据都封装到一个Map里,然后再存放到List
三、测试
3.1实体类
@Data
public class Actor {
Integer id;
String name;
String sex;
Date borndate;
String phone;
public Actor(Integer id,String name, String sex, Date borndate, String phone) {
this.id=id;
this.name = name;
this.sex = sex;
this.borndate = borndate;
this.phone = phone;
}
//添加无参构造,底层可能用到反射
public Actor(){
}
3.2德鲁伊连接池工具类
需要下载druid的jar包
public class DruidUtil {
private static DataSource ds;
static {
try {
Properties properties = new Properties();
properties.load(new FileInputStream("src\\main\\resources\\druid.properties"));
ds=DruidDataSourceFactory.createDataSource(properties);
}
catch (Exception e) {
e.printStackTrace();
}
}
//获取连接
public static Connection getConnect() throws SQLException {
return ds.getConnection();
}
//关闭连接, 不是真的关闭,只是放回连接池,断掉对象引用
public static void close(ResultSet resultSet, Statement statement,Connection connection){
try {
if (resultSet!=null){
resultSet.close();
}
if (connection!=null){
connection.close();
}
if (statement!=null){
statement.close();
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
3.3 德鲁伊配置文件druid.properties
#批处理rewriteBatchedStatements
url=jdbc:mysql://localhost:3306/db01?rewriteBatchedStatements=true
username=root
password=123456
driverClassName=com.mysql.jdbc.Driver
initialSize=5
maxActive=20
#最小连接数,空闲时
minIdle=1
#最大等待时间,排队超时
maxWait=60000
validationQuery=SELECT 1
testOnBorrow=true
testWhileIdle=true
3.3 测试方法
@Test
public void dBUtilTest() throws SQLException {
//1.连接
Connection connect = DruidUtil.getConnect();
//2.创建QueryRunner
QueryRunner queryRunner = new QueryRunner();
//3.执行相关的方法,返回结果集
String sql="select * from actor where id>=?";
//new BeanListHandler<>(Actor.class) ,将resultSet-->Actor--》封装到ArrayList中
//底层使用反射机制去获取Actor类的属性,然后封装
//1 是给sql语句赋值,可变参数列,按顺序赋值给sql中的问号?
List<Actor> list = queryRunner.query(connect, sql, new BeanListHandler<>(Actor.class),1);
for (Actor actor : list) {
System.out.println(actor);
}
// query()会自动关闭资源resultSet、prepareStatement , 因此下面只要关闭connect即可
JDBCUtil.close(null,connect,null);
}
注意:
1.实体类必须要有无参构造器!以及set方法;
2.如果没有set方法,则输出的结果都是null;
3.如果没有无参构造器,则会抛出异常。
四、源码分析
源码中,会通过反射获取Actor类的所有方法。如果有set开头的方法,则会把查询结果赋予给实体类中的对应属性。
无参构造用于底层创建实例,如果没有无参构造会抛出异常。