dbutils简介
Commons DbUtils是Apache组织提供的一个对JDBC进行简单封装的开源工具类库,使用它能够简化JDBC应用程序的开发,同时也不会影响程序的性能。
在java世界里操作数据库有很多方式,在众多方式中除了JDBC外都有DataSource对象。
DataSource可以看作数据源,它封装了数据库参数,连接数据库,程序中操作DataSource对象即可对数据库进行增删改查操作。
DataSource实际上是一个接口,实现这个接口必须重写getConnection方法,即可以获得Connection对象,有了Connection对象即可以对数据库操作。
我们一般和c3p0一起使用dbutils,c3p0是连接池,可以为我们提供DataSource对象,它的DataSource类是com.mchange.v2.c3p0.ComboPooledDataSource
使用方法
准备
首先我们新建maven工程,导入mysql、dbutils、c3p0的jar包
然后对c3p0进行配置:在resources文件夹下新建c3p0-config.xml
配置文件,写入以下内容
<?xml version="1.0" encoding="UTF-8" ?>
<c3p0-config>
<default-config>
<property name="user">用户名</property>
//数据库用户名
<property name="password">密码</property>
//数据库密码
<property name="jdbcUrl">jdbc:mysql://localhost:3306/数据库名称?serverTimezone=UTC</property>
//jdbc数据库连接地址
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
//加载相应数据库驱动
<property name="checkoutTimeout">30000</property>
//当连接池用完时客户端调用getConnection()后等待获取新连接的时间,超时后将抛出SQLException,如设为0则无限期等待。单位毫秒。
<property name="idleConnectionTestPeriod">30</property>
//每个几秒检查所有连接池中的空闲连接
<property name="initialPoolSize">3</property>
//连接池初始化时创建的连接数
<property name="maxIdleTime">30</property>
//连接的最大空闲时间,如果超过这个时间,某个数据库连接还没有被使用,则会断开掉这个连接如果为0,则永远不会断开连接
<property name="maxPoolSize">100</property>
连接池中拥有的最大连接数,如果获得新连接时会使连接总数超过这个值则不会再获取新连接,而是等待其他连接释放,所以这个值有可能会设计地很大
<property name="minPoolSize">2</property>
连接池保持的最小连接数,后面的maxIdleTimeExcessConnections跟这个配合使用来减轻连接池的负载
<property name="acquireIncrement">5</property>
//连接池在无空闲连接可用时一次性创建的新数据库连接数
<property name="maxIdleTimeExcessConnection">25</property>
//单位秒,为了减轻连接池的负载,当连接池经过数据访问高峰创建了很多连接,但是后面连接池不需要维护这么多连接,必须小于maxIdleTime.配置不为0,则将连接池的数量保持到minPoolSize
</default-config>
</c3p0-config>
使用
新建QueryRunner对象
private QueryRunner queryRunner = new QueryRunner(new ComboPooledDataSource());
ComboPooledDataSource
就算c3p0为我们提供的dataSource对象。
QueryRunner对象的方法:
QueryRunner(DataSource ds) ; //传入参数为连接池提供的dataSource对象
QueryRunner(); //无参构造函数,在执行sql语句时,第一个参数必须是Connection对象
update(String sql, Object… params); //执行insert update delete操作
query(String sql, ResultSetHandler rsh, Object… params) ; //执行 select操作
ResultSetHandler 实现类
ArrayHandler:把结果集中的第一行数据转成对象数组。
ArrayListHandler:把结果集中的每一行数据都转成一个对象数组,再存放到List中。
BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。 //重点
BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。//重点
MapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。//重点
MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List
ColumnListHandler:将结果集中某一列的数据存放到List中。
KeyedHandler:将结果集中的每一行数据都封装到一个Map里(List<Map>),再把这些map再存到一个map里,其key为指定的列。
ScalarHandler:将结果集第一行的某一列放到某个对象中。//重点
然后就可以通过queryRunner
运行sql语句了。例如:
queryRunner.query("select * from account where id = ?",new BeanHandler<Account>(Account.class),109);