数据库开源框架DBUtils的用法
简介
Commons DbUtils是Apache组织提供的一个对JDBC进行简单封装的开源工具类库,使用它能够简化JDBC应用程序的开发,同时也不会影响程序的性能。
QueryRunner类:
该类简化了SQL查询,它与ResultHandler接口一起使用可以完成大部分的数据库操作。能够大大减少编码量。
该类提供了两个构造方法:
1、不带参的构造方法
2、需要一个javax.sql.DataSource来作为参数的构造函数,使用这个构造函数实例化QueryRunner对象后,它会从连接池中获取Connection
一:Dbutils是什么?(当我们很难理解一个东西的官方解释的时候,就让我们记住它的作用)
Dbutils:主要是封装了JDBC的代码,简化dao层的操作。
作用:帮助java程序员,开发Dao层代码的简单框架。
框架的作用:帮助程序员,提高程序的开发效率。
出生:Dbutils是由Apache公司提供。
二:为什么需要Dbutils ?
在使用Dbutils 之前,我们Dao层使用的技术是JDBC,那么分析一下JDBC的弊端:
(1)数据库链接对象、sql语句操作对象,封装结果集对象,这三大对象会重复定义
(2)封装数据的代码重复,而且操作复杂,代码量大
(3)释放资源的代码重复
结果:(1)程序员在开发的时候,有大量的重复劳动。(2)开发的周期长,效率低
三:Dbutils三个核心类介绍:
1:DbUtils:连接数据库对象----jdbc辅助方法的集合类,线程安全
构造方法:DbUtils()
作用:控制连接,控制书屋,控制驱动加载额一个类。
2:QueryRunner:SQL语句的操作对象,可以设置查询结果集的封装策略,线程安全。
构造方法:
(1)QueryRunner():创建一个与数据库无关的QueryRunner对象,后期再操作数据库的会后,需要手动给一个Connection对象,它可以手动控制事务。
Connection.setAutoCommit(false); 设置手动管理事务
Connection.commit(); 提交事务
(2)QueryRunner(DataSource ds):创建一个与数据库关联的queryRunner对象,后期再操作数据库的时候,不需要Connection对象,自动管理事务。
DataSource:数据库连接池对象。
执行步骤
1.加载JDBC驱动程序类,并用DriverManager来得到一个数据库连接conn。
2.实例化 QueryRunner,得到实例化对象qRunner。
3. qRunner.update()方法,执行增改删的sql命令,
qRunner.query()方法,得到结果集。
1.DBUtils的jar包
2.<!-- default-config 默认的配置, -->
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<!-- default-config 默认的配置, -->
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost/bank</property>
<property name="user">root</property>
<property name="password">123456</property>
<property name="initialPoolSize">10</property>
<property name="maxIdleTime">30</property>
<property name="maxPoolSize">100</property>
<property name="minPoolSize">10</property>
<property name="maxStatements">200</property>
</default-config>
<!-- This app is massive! -->
<named-config name="oracle">
<property name="acquireIncrement">50</property>
<property name="initialPoolSize">100</property>
<property name="minPoolSize">50</property>
<property name="maxPoolSize">1000</property>
<!-- intergalactoApp adopts a different approach to configuring statement caching -->
<property name="maxStatements">0</property>
<property name="maxStatementsPerConnection">5</property>
<!-- he's important, but there's only one of him -->
<user-overrides user="master-of-the-universe">
<property name="acquireIncrement">1</property>
<property name="initialPoolSize">1</property>
<property name="minPoolSize">1</property>
<property name="maxPoolSize">5</property>
<property name="maxStatementsPerConnection">50</property>
</user-overrides>
</named-config>
</c3p0-config>
默认文件名c3p-config.xml 系统默认执行 无需自动连接
数据库版本在4及以上可以不用启动,底层系统自动启动
配置好 可以直接写 只需俩行代码即可实现
package com.itheima.uitl;
import java.sql.SQLException;
import java.util.List;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.junit.Test;
import com.itheima.domain.Account;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class TestDemo {
@Test
public void test() throws SQLException{
QueryRunner qRunner=new QueryRunner(new ComboPooledDataSource() );
//插入
qRunner.update("insert into account values (28,?,?)","eee",2220);
//删除
qRunner.update("delete from account where id=?",28);
//修改
qRunner.update("update account set money =? where id=?",60000,4);
//单个查询
Account account1 = qRunner.query("select * from account where id=?",new BeanHandler<Account>(Account.class),4);
System.out.println(account1);
//多个查询
Account query = qRunner.query("select * from account where id=?", new BeanHandler<Account>(Account.class),4);
System.out.println(query);
List<Account> list = qRunner.query("select * from account",new BeanListHandler<>(Account.class));
for (Account account : list) {
System.out.println(account);
}
}
}
具体配置文件已经上传 DButils模板可以下载 仿写
Account query = qRunner.query("select * from account where id=?", new ResultSetHandler<Account>(){
@Override
public Account handle(ResultSet rs) throws SQLException {
// TODO Auto-generated method stub
return null;
}},2);
System.out.println(query);
总结常用的实现类
ArrayHandler, 查询单个数据封装成一个数组
ArrayListHandler, 查询多个数据封装一个集合里面是数组
BeanHandler, 查询单个数据封装成一个对象
BeanListHandler, 查询多个数据封装一个集合里面元素是list<对象>
MapHandler, 查询单个数据封装成一个map
MapListHandler, 查询多个数据封装一个集合里面元素是map