天天看點

Java DButils介紹及使用(含代碼)

一: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:資料庫連接配接池對象。
           

        (3)ResultSetHandle:封裝資料的政策對象------将封裝結果集中的資料,轉換到另一個對象

          政策:封裝資料到對象的方式(示例:将資料庫儲存在User、儲存到數組、儲存到集合)

         方法介紹:handle(ResultSet rs)

四:Dbutils快速入門

     使用Dbutils注意事項:

          (1)需要導入的jar包:①MySql驅動     ②c3p0包     ③DbUtils包

          (2)添加c3p0配置檔案

          (3)可以自行添加一個JDBCUtils工具類:用來擷取c3p0連接配接池對象

c3p0配置檔案:c3p0-config.xml

<? xml version ="1.0" encoding= "UTF-8" ?>
< c3p0-config>
       <!-- 預設配置,c3p0架構預設加載這段預設配置 -->
       < default-config>
             <!-- 配置JDBC 四個基本屬性 -->
             < property name ="driverClass" > com.mysql.jdbc.Driver</ property >
             < property name ="jdbcUrl" > jdbc:mysql:///資料庫名</ property >
             < property name ="user" > 資料庫使用者名</ property >
             < property name ="password" > 資料庫密碼</ property >
       </ default-config> <!-- This app is massive! -->
</ c3p0-config>
           

JDBCUtils工具類:JDBCUtils. java

package cn.utils;

import java.sql.Connection;
import java.sql.SQLException;

import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class JDBCUtils {

    // 獲得c3p0連接配接池對象
    private static ComboPooledDataSource ds = new ComboPooledDataSource();

    /**
     * 獲得資料庫連接配接對象
     *
     * @return
     * @throws SQLException
     */
    public static Connection getConnection() throws SQLException {
        return ds.getConnection();
    }

    /**
     * 獲得c3p0連接配接池對象
     * @return
     */
    public static DataSource getDataSource() {
        return ds;
    }
}
           

案例一:使用queryRunner對象完成增删改操作:

1.資料表

drop database if exists jdbc;
CREATE DATABASE IF NOT EXISTS jdbc;
USE jdbc;
 
drop table if exists user ;
CREATE TABLE IF NOT EXISTS `user ` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  ` name` varchar(50) DEFAULT NULL ,
  `pwd` varchar(50) DEFAULT NULL ,
  PRIMARY KEY (`id`)
) ;
#資料初始化
insert into user values (null ,'zhangsan' ,'123456' );
insert into user values (null ,'lisi' ,'123456' );
           

2:示範代碼

//需求:向user表插入一條資料
 
@Test
 
public void test1(){
 
    //第一步:建立queryRunner對象,用來操作sql語句
 
    QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
 
    //第二步:建立sql語句
 
    String sql = "insert into user values(null,?,?)";
 
    //第三步:執行sql語句,params:是sql語句的參數
 
    //注意,給sql語句設定參數的時候,按照user表中字段的順序
 
    try {
 
        int update = qr.update(sql, "狗蛋","123456");
 
        System.out.println(update);
 
    } catch (SQLException e) {
     
        e.printStackTrace();
 
    }
 
}
 
//需求:修改id==7的資料
 
@Test
 
public void test2(){
 
    //第一步:建立queryRunner對象,用來操作sql語句
 
    QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
 
    //第二步:建立sql語句
     
    String sql = "update user set name = ? where id = ?";
 
    //第三步:執行sql語句,params:是sql語句的參數
 
    //注意,給sql語句設定參數的時候,按照user表中字段的順序
 
    try {
 
        int update = qr.update(sql, "柳岩",7);
 
        System.out.println(update);
 
    } catch (SQLException e) {
 
        e.printStackTrace();
 
    }
 
}
 
//需求:删除id==7的資料
 
@Test
 
public void test3(){
 
    //第一步:建立queryRunner對象,用來操作sql語句
 
    QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
 
    //第二步:建立sql語句
 
    String sql = "delete from user where id = ?";
 
    //第三步:執行sql語句,params:是sql語句的參數
 
    //注意,給sql語句設定參數的時候,按照user表中字段的順序
 
    try {
 
        int update = qr.update(sql, 7);
 
        System.out.println(update);
 
    } catch (SQLException e) {
 
        e.printStackTrace();
 
    }
 
}
           

案例二:QueryRunner的query方法和ResultSetHandler接口的使用

     1:資料庫表

          同上一案例User表

     2:自定義實作ResultSetHandler封裝查詢結果集

          自定義政策

package cn.handler;
 
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
 
import org.apache.commons.dbutils.ResultSetHandler;
 
import cn.itcast.domain.User;
// ResultSetHandler<T>,<T>表示封裝結果的類型
//MyHandler 是自定義的ResultSetHandler封裝結果集政策對象
public class MyHandler implements ResultSetHandler<List<User>>{
 
   @Override
   public List<User> handle(ResultSet rs) throws SQLException {
      // 封裝資料,資料從 Resultset 中擷取
      List<User> list = new ArrayList<User>();
       while(rs.next()){
         User u = new User();
         u.setId(rs.getInt( "id"));
         u.setName(rs.getString( "name"));
         u.setPwd(rs.getString( "pwd"));
 
         list.add(u);
      }
       return list;
   }
 
}
           

3:測試代碼

//需求:擷取user表中所有的資料
 
@Test
 
public void test4(){
 
    //第一步:建立queryRunner對象,用來操作sql語句
 
    QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
 
    //第二步:建立sql語句
 
    String sql = "select * from user";
 
    //第三步:執行sql語句,params:是sql語句的參數
     
    //注意,給sql語句設定參數的時候,按照user表中字段的順序
 
    try {
 
        List<User> list = qr.query(sql, new MyHandler());
 
        System.out.println(list);
 
    } catch (SQLException e) {
 
        e.printStackTrace();
 
    }
 
}
           

案例三:ResultSetHandler實作類介紹(由DbUtils架構提供)

     備注:DbUtils給我們提供了10個ResultSetHandler實作類,分别是:

     ①ArrayHandler:     将查詢結果的第一行資料,儲存到Object數組中

     ②ArrayListHandler  :   将查詢的結果,每一行先封裝到Object數組中,然後将資料存入List集合

     ③BeanHandler  :  将查詢結果的第一行資料,封裝到user對象

     ④BeanListHandler :    将查詢結果的每一行封裝到user對象,然後再存入List集合

     ⑤ColumnListHandler :    将查詢結果的指定列的資料封裝到List集合中

     ⑥MapHandler :    将查詢結果的第一行資料封裝到map結合(key==列名,value==列值)

     ⑦MapListHandler :    将查詢結果的每一行封裝到map集合(key==列名,value==列值),再将map集合存入List集合

     ⑧BeanMapHandler :     将查詢結果的每一行資料,封裝到User對象,再存入mao集合中(key==列名,value==列值)

     ⑨KeyedHandler :    将查詢的結果的每一行資料,封裝到map1(key==列名,value==列值 ),然後将map1集合(有多個)存入map2集合(隻有一個)

     ⑩ScalarHandler  :   封裝類似count、avg、max、min、sum......函數的執行結果

    以上10個ResultSetHandler實作類,常用的是BeanHandler、BeanListHandler和ScalarHandler,下面将對這三個實作類,寫測試類

一: 測試BeanHandler政策 

//需求:測試BeanHandler政策
 
//BeanHandler:将查詢結果的第一行資料,封裝到user對象
 
@Test
 
public void test7(){
 
    //第一步:建立queryRunner對象,用來操作sql語句
 
    QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
 
    //第二步:建立sql語句
 
    String sql = "select * from user";
 
    //第三步:執行sql語句,params:是sql語句的參數
 
    //注意,給sql語句設定參數的時候,按照user表中字段的順序
 
    try {
 
        User user = qr.query(sql, new BeanHandler<User>(User.class));
 
        System.out.println(user);
 
    } catch (SQLException e) {
 
        e.printStackTrace();
 
    }
 
}
           

 二:測試BeanListHandler政策

//需求:測試BeanListHandler政策
 
//BeanListHandler:将查詢結果的每一行封裝到user對象,然後,再存入list集合
 
@Test
 
public void test8(){
 
    //第一步:建立queryRunner對象,用來操作sql語句
 
    QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
 
    //第二步:建立sql語句
 
    String sql = "select * from user";
 
    //第三步:執行sql語句,params:是sql語句的參數
 
    //注意,給sql語句設定參數的時候,按照user表中字段的順序
 
    try {
 
        List<User> list = qr.query(sql, new BeanListHandler<User>(User.class));
 
        System.out.println(list);
 
    } catch (SQLException e) {
 
        e.printStackTrace();
 
    }
 
}
           

 三:測試ScalarHandler政策

//需求:測試ScalarHandler政策
 
//ScalarHandler:封裝類似count、avg、max、min、sum。。。。函數的執行結果
 
@Test
 
public void test14(){
 
    //第一步:建立queryRunner對象,用來操作sql語句
 
    QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
 
    //第二步:建立sql語句
 
    String sql = "select count(*) from user";
 
    //第三步:執行sql語句,params:是sql語句的參數
 
    //注意,給sql語句設定參數的時候,按照user表中字段的順序
 
    try {
 
        Object object = qr.query(sql, new ScalarHandler());
 
        System.out.println(object);
 
    } catch (SQLException e) {
 
        e.printStackTrace();
 
    }
 
}
           

以上三個有測試案例的ResultSetHandler政策為常用實作類。

轉自:

https://www.cnblogs.com/CQY1183344265/p/5854418.html

表示感謝!!