DButils详解

什么是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

点赞

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注