什么是DButils
Dbutils是由Apache公司提供。
Dbutils:主要是封装了JDBC的代码,简化dao层的操作。
作用:帮助java程序员,开发Dao层代码的简单框架。
解决了JDBC的一些弊端:
(1)数据库链接对象、sql语句操作对象,封装结果集对象,这三大对象会重复定义
(2)封装数据的代码重复,而且操作复杂,代码量大
(3)释放资源的代码重复
(4)程序员在开发的时候,有大量的重复劳动。
(5)开发的周期长,效率低
Dbutils三个核心类
DbUtils
DbUtils:连接数据库对象—-jdbc辅助方法的集合类,线程安全
– 构造方法:DbUtils()
– 作用:DbUtils 工具类 提供驱动管理、事务管理、释放资源等一系列公共方法
ResultSetHandler
ResultSetHandler:结果集封装接口,完成将ResultSet 结果集 封装为一个Java对象
ResultSetHandler 在DBUtils 框架中提供十个默认实现类,直接使用十个默认实现类,可以完成常规操作,而不需要自定义结果集封装
常用:
- ArrayHandler //把结果集中的第一行数据转成对象数组Object[]。
- ArrayListHandler //把结果集中的每一行数据都转成一个对象数组Object[],再存放到List中。
- BeanHandler //将结果集中的第一行数据封装到一个对应的JavaBean实例中。(封装javabean属性时,必须保证数据表列名与 javabean属性名一致,否则无法封装)
- BeanListHandler //将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。
- ColumnListHandler //将结果集中某一列的数据存放到List中。
- KeyedHandler //将结果集中的每一行数据都封装到一个Map里,然后再根据指定的key把每个Map再存放到一个Map里。
- MapHandler //将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。
- MapListHandler //将结果集中的每一行数据都封装到一个Map里,然后再存放到List。
- ScalarHandler //将结果集中某一条记录的其中某一列的数据存成Object。
- BeanMapHandler // 将查询结果的每一行数据,封装到bean对象,再存入map集合中(key==列名,value==列值)
QueryRunner
框架核心类 ,所有数据库操作都是必须通过QueryRunner进行。SQL语句的操作对象,可以设置查询结果集的封装策略,线程安全。
构造方法:
- (1)QueryRunner():创建一个与数据库无关的QueryRunner对象,后期再操作数据库的事务,需要手动给一个Connection对象,它可以手动控制事务。
Connection.setAutoCommit(false); 设置手动管理事务
Connection.commit(); 提交事务
- (2)QueryRunner(DataSource ds):创建一个与数据库关联的queryRunner对象,后期再操作数据库的时候,不需要Connection对象,自动管理事务。
DataSource:数据库连接池对象。
构造函数与增删改查方法的组合:
QueryRunner() -------- 没有传递连接池给DBUtils 框架,框架不能获得数据库连接,接下来每个操作,必须将数据库连接传给框架 (手动管理事务)
update(Connection conn, String sql, Object... params)
query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params)
QueryRunner(DataSource ds) ---- 将连接池给DBUtils框架,以后每个操作,都会从连接池中获取一个新的连接 (每条SQL 一个单独的事务)
update(String sql, Object... params)
query(String sql, ResultSetHandler<T> rsh, Object... params)
- (3)ResultSetHandle:封装数据的策略对象——将封装结果集中的数据,转换到另一个对象
策略:封装数据到对象的方式(示例:将数据库保存在User、保存到数组、保存到集合)
方法介绍:handle(ResultSet rs)
备注:详解参考ResultSetHandle实现类
使用DButils准备
使用Dbutils注意事项:
(1)需要导入的jar包:①MySql驱动 ②c3p0包 ③DbUtils包
(2)添加c3p0配置文件
(3)可以自行添加一个C3P0Utils工具类:用来获取c3p0连接池对象
添加依赖
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.34</version>
</dependency>
<dependency>
<groupId>commons-dbutils</groupId>
<artifactId>commons-dbutils</artifactId>
<version>1.4</version>
</dependency>
C3P0配置文件c3p0-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<named-config name="mvcApp">
<property name="user">root</property>
<property name="password">123456</property>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/javatest
</property>
</named-config>
</c3p0-config>
工具类C3P0Utils.java
package util;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class C3P0DBUtils {
private static Connection con = null;
private static PreparedStatement ps = null;
private static CallableStatement callableStatement = null;
private static ResultSet rs = null;
private static DataSource dataSource = new ComboPooledDataSource("mvcApp");
/**
* 获取连接
*
* @return
* @throws SQLException
*/
public static Connection getConnection() throws SQLException {
return dataSource.getConnection();
}
public static DataSource getDataSource() {
return dataSource;
}
}
DButils框架测试
package mysql;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import org.junit.Test;
import entity.Guests;
import util.C3P0DBUtils;
import util.DateUtils;
public class DBUtilTest {
QueryRunner qr = new QueryRunner(C3P0DBUtils.getDataSource());
@Test
public void test1(){
String sql = "insert into myguests values(null,?,?,?,?)";
try {
int update = qr.update(sql,"狗蛋","王","wang@123",DateUtils.getTimestampNow());
if(update>0){
System.out.println("插入成功"+update);
}else{
System.out.println("插入失败");
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Test
public void test2(){
String sql = "update myguests set firstname=? where id =?";
try {
int update = qr.update(sql,"哪吒",10);
if(update>0){
System.out.println("修改成功"+update);
}else{
System.out.println("修改失败");
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Test
public void test3(){
String sql = "delete from myguests where id =?";
try {
int update = qr.update(sql,9);
if(update>0){
System.out.println("删除成功"+update);
}else{
System.out.println("删除失败");
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 测试BeanHandler
*/
@Test
public void test4(){
String sql = "select * from myguests";
try {
Guests guest = qr.query(sql, new BeanHandler<Guests>(Guests.class));
if(guest!=null){
System.out.println("获取成功"+guest.getFirstname());
}else{
System.out.println("获取失败");
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 测试BeanListHandler
*/
@Test
public void test5(){
String sql = "select * from myguests";
try {
List<Guests> list = qr.query(sql, new BeanListHandler<Guests>(Guests.class));
if(list!=null){
System.out.println("获取成功"+list.size());
}else{
System.out.println("获取失败");
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 需求:测试ScalarHandler策略
* ScalarHandler:封装类似count、avg、max、min、sum。。。。函数的执行结果
*/
@Test
public void test6(){
String sql = "select count(*) from myguests";
try {
Object object= qr.query(sql, new ScalarHandler());
if(object!=null){
System.out.println("获取成功"+object);
}else{
System.out.println("获取失败");
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 自定义结果集封装
*/
@Test
public void test7(){
String sql = "select * from myguests";
try {
List<Guests> object= qr.query(sql,new ResultSetHandler<List<Guests>>(){
@Override
public List<Guests> handle(ResultSet rs) throws SQLException {
// TODO Auto-generated method stub
List<Guests> guests = new ArrayList<Guests>();
while (rs.next()) {
Guests guest = new Guests();
guest.setId(rs.getInt("id"));
guest.setFirstname(rs.getString("firstname"));
guest.setLastname(rs.getString("lastname"));
guest.setEmail(rs.getString("email"));
guest.setReg_date(rs.getTimestamp("reg_date"));
guests.add(guest);
}
return guests;
}
}
);
if(object!=null){
System.out.println("获取成功");
for (int i = 0; i < object.size(); i++) {
Guests guest=object.get(i);
System.out.println(guest.getFirstname()+"\t"+guest.getEmail());
}
}else{
System.out.println("获取失败");
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
参考
https://www.cnblogs.com/CQY1183344265/p/5854418.html
https://www.cnblogs.com/vaer/p/3903538.html
https://blog.csdn.net/samjustin1/article/details/52220423