1. 程式人生 > >030 DBUtils工具類與DataSource資料庫連線池

030 DBUtils工具類與DataSource資料庫連線池

1. DButils工具類的介紹個三個核心類

1. DButils工具類的介紹個三個核心類

a: 概述
  1. DBUtils是java程式設計中的資料庫操作實用工具,小巧簡單實用。
  2. DBUtils封裝了對JDBC的操作,簡化了JDBC操作,可以少寫程式碼。
  3. DBUtils就是JDBC的簡化開發工具包。需要專案匯入commons-dbutils-1.6.jar才能夠正常使用DBUtils工具。

2. Dbutils三個核心功能介紹

1. QueryRunner中提供對sql語句操作的API.
  1. update(Connection conn, String sql, Object… params) ,用來完成表資料的增加、刪除、更新操作
  2. query(Connection conn, String sql, ResultSetHandler rsh, Object… params) ,用來完成表資料的查詢操作
2. ResultSetHandler介面
用於定義select操作後,怎樣封裝結果集.
3. DbUtils類
它就是一個工具類,定義了關閉資源與事務處理的方法

2. QueryRunner類的update方法介紹

1. QueryRunner類的update方法介紹

1. 方法介紹
  1. update(Connection conn, String sql, Object… params) ,用來完成表資料的增加、刪除、更新操作
  2. 使用QueryRunner類,實現對資料表的insert delete update
  3. 呼叫QueryRunner類的方法 update (Connection con,String sql,Object…param)
  4. Object…param 可變引數,Object型別,SQL語句會出現?佔位符
  5. 資料庫連線物件,自定義的工具類傳遞

3. QueryRunner類實現insert新增資料

QueryRunner類實現insert新增資料

案例程式碼
public class QueryRunnerDemo {
    private static Connection con = JDBCUtilsConfig.getConnection();
    public
static void main(String[] args)throws SQLException { insert(); } /* * 定義方法,使用QueryRunner類的方法update向資料表中,新增資料 */ public static void insert()throws SQLException{ //建立QueryRunner類物件 QueryRunner qr = new QueryRunner(); String sql = "INSERT INTO sort (sname,sprice,sdesc)VALUES(?,?,?)"; //將三個?佔位符的實際引數,寫在陣列中 Object[] params = {"體育用品",289.32,"購買體育用品"}; //呼叫QueryRunner類的方法update執行SQL語句 int row = qr.update(con, sql, params); System.out.println(row); DbUtils.closeQuietly(con); } }

4. QueryRunner類實現update修改資料

QueryRunner類實現update修改資料

案例程式碼
public class QueryRunnerDemo {
    private static Connection con = JDBCUtilsConfig.getConnection();
    public static void main(String[] args)throws SQLException {
        update();
    }

    /*
     *  定義方法,使用QueryRunner類的方法update將資料表的資料修改
     */
    public static void update()throws SQLException{
        //建立QueryRunner類物件
        QueryRunner qr = new QueryRunner(); 
        //寫修改資料的SQL語句
        String sql = "UPDATE sort SET sname=?,sprice=?,sdesc=? WHERE sid=?";

        //定義Object陣列,儲存?中的引數
        Object[] params = {"花卉",100.88,"情人節玫瑰花",4};
        //呼叫QueryRunner方法update
        int row = qr.update(con, sql, params);
        System.out.println(row);
        DbUtils.closeQuietly(con);
    }               
}

5. QueryRunner類實現delete刪除資料

QueryRunner類實現delete刪除資料

案例程式碼
public class QueryRunnerDemo {
    private static Connection con = JDBCUtilsConfig.getConnection();

    public static void main(String[] args) throws SQLException {
        delete();
    }
    /*
     * 定義方法,使用QueryRunner類的方法delete將資料表的資料刪除
     */
    public static void delete()throws SQLException{
        //建立QueryRunner類物件
        QueryRunner qr = new QueryRunner(); 
        //寫刪除的SQL語句
        String sql = "DELETE FROM sort WHERE sid=?";
        //呼叫QueryRunner方法update
        int row = qr.update(con, sql, 8);
        System.out.println(row);
        /*
        *  判斷insert,update,delete執行是否成功
        *  對返回值row判斷
        *  if(row>0) 執行成功
        */
        DbUtils.closeQuietly(con);
    }               
}

6. JavaBean類

JavaBean類

概念

JavaBean就是一個類,在開發中常用封裝資料。具有如下特性
1. 需要實現介面:java.io.Serializable ,通常實現介面這步驟省略了,不會影響程式。
2. 提供私有欄位:private 型別 欄位名;
3. 提供getter/setter方法:
4. 提供無參構造

7. DBUtils工具類結果集處理的方式

DBUtils工具類結果集處理的方式

1. QueryRunner實現查詢操作

query(Connection conn, String sql, ResultSetHandler rsh, Object… params) ,用來完成表資料的查詢操作

2. ResultSetHandler結果集處理類
  • ArrayHandler 將結果集中的第一條記錄封裝到一個Object[]陣列中,陣列中的每一個元素就是這條記錄中的每一個欄位的值
  • ArrayListHandler 將結果集中的每一條記錄都封裝到一個Object[]陣列中,將這些陣列在封裝到List集合中。
  • BeanHandler 將結果集中第一條記錄封裝到一個指定的javaBean中。
  • BeanListHandler 將結果集中每一條記錄封裝到指定的javaBean中,將這些javaBean在封裝到List集合中
  • ColumnListHandler 將結果集中指定的列的欄位值,封裝到一個List集合中
  • ScalarHandler 它是用於單資料。例如select count(*) from 表操作。
  • MapHandler 將結果集第一行封裝到Map集合中,Key 列名, Value 該列資料
  • MapListHandler 將結果集第一行封裝到Map集合中,Key 列名, Value 該列資料,Map集合儲存到List集合

9. QueryRunner類的方法query

QueryRunner類的方法query

1. QueryRunner資料查詢操作
  • 呼叫QueryRunner類方法query(Connection con,String sql,ResultSetHandler r, Object..params)
  • ResultSetHandler r 結果集的處理方式,傳遞ResultSetHandler介面實現類
  • Object..params SQL語句中的?佔位符
  • 注意: query方法返回值,返回的是T 泛型, 具體返回值型別,跟隨結果集處理方式變化
2. 案例程式碼
public class QueryRunnerDemo1 {
    private static Connection con = JDBCUtilsConfig.getConnection();
}

9. 結果集處理ArrayHandler

結果集處理ArrayHandler

案例程式碼
public class QueryRunnerDemo1 {
    private static Connection con = JDBCUtilsConfig.getConnection();

    public static void main(String[] args) throws SQLException{
        arrayHandler();
    }

    /*
     *  結果集第一種處理方法, ArrayHandler
     *  將結果集的第一行儲存到物件陣列中  Object[]
     */
    public static void arrayHandler() throws SQLException{
        QueryRunner qr = new QueryRunner();
        String sql = "SELECT * FROM sort";
        //呼叫方法query執行查詢,傳遞連線物件,SQL語句,結果集處理方式的實現類
        //返回物件陣列
        Object[] result = qr.query(con, sql, new ArrayHandler());
        for(Object obj : result) {
            System.out.print(obj);
        }
    }
}

10. 結果集處理ArrayListHandler

結果集處理ArrayListHandler

1. 案例程式碼
public class QueryRunnerDemo1 {
    private static Connection con = JDBCUtilsConfig.getConnection();

    public static void main(String[] args) throws SQLException{
        arrayListHandler();
    }

    /*
     * 結果集第二種處理方法,ArrayListHandler
     * 將結果集的每一行,封裝到物件陣列中, 出現很多物件陣列
     * 物件陣列儲存到List集合
     */
    public static void arrayListHandler()throws SQLException{
        QueryRunner qr = new QueryRunner();
        String sql = "SELECT * FROM sort";      
        //呼叫query方法,結果集處理的引數上,傳遞實現類ArrayListHandler
        //方法返回值 每行是一個物件陣列,儲存到List
        List<Object[]> result=  qr.query(con, sql, new ArrayListHandler());

        //集合的遍歷
        for( Object[] objs  : result){
            //遍歷物件陣列
            for(Object obj : objs){
                System.out.print(obj+"  ");
            }
            System.out.println();
        }
    }
}

11. 結果集處理BeanHandler

1. 結果集處理BeanHandler

案例程式碼
public class QueryRunnerDemo1 {
    private static Connection con = JDBCUtilsConfig.getConnection();

    public static void main(String[] args) throws SQLException{
        beanHandler();
    }

    /*
     *  結果集第三種處理方法,BeanHandler
     *  將結果集的第一行資料,封裝成JavaBean物件
     *  注意: 被封裝成資料到JavaBean物件, Sort類必須有空引數構造
     */
    public static void beanHandler() throws SQLException{
        QueryRunner qr = new QueryRunner();
        String sql = "SELECT * FROM sort ";

        //呼叫方法,傳遞結果集實現類BeanHandler
        //BeanHandler(Class<T> type) 
        Sort s = qr.query(con, sql, new BeanHandler<Sort>(Sort.class));
        System.out.println(s);
    }
}

12. 結果集處理BeanListHandler

1. 結果集處理BeanListHandler

案例程式碼
public class QueryRunnerDemo1 {
    private static Connection con = JDBCUtilsConfig.getConnection();

    public static void main(String[] args) throws SQLException{
        beanListHander();
    }
    /*
    *  結果集第四種處理方法, BeanListHandler
    *  結果集每一行資料,封裝JavaBean物件
    *  多個JavaBean物件,儲存到List集合
    */
    public static void beanListHander()throws SQLException{
        QueryRunner qr = new QueryRunner();
        String sql = "SELECT * FROM sort ";

        //呼叫方法query,傳遞結果集處理實現類BeanListHandler
        List<Sort> list = qr.query(con, sql, new BeanListHandler<Sort>(Sort.class));
        for(Sort s : list){
            System.out.println(s);
        }
    }
}

13. 結果集處理ColumnListHandler

1. 結果集處理ColumnListHandler

案例程式碼
public class QueryRunnerDemo1 {
    private static Connection con = JDBCUtilsConfig.getConnection();

    public static void main(String[] args) throws SQLException{
        columnListHandler();
    }

    /*
     *  結果集第五種處理方法,ColumnListHandler
     *  結果集,指定列的資料,儲存到List集合
     *  List<Object> 每個列資料型別不同
     */
    public static void columnListHandler()throws SQLException{
        QueryRunner qr = new QueryRunner();
        String sql = "SELECT * FROM sort ";     
        //呼叫方法 query,傳遞結果集實現類ColumnListHandler

        //實現類構造方法中,使用字串的列名
        List<Object> list = qr.query(con, sql, new ColumnListHandler<Object>("sname"));
        for(Object obj : list){
            System.out.println(obj);
        }
    }
}

14. 結果集處理ScalarHandler

1. 結果集處理ScalarHandler

案例程式碼
public class QueryRunnerDemo1 {
    private static Connection con = JDBCUtilsConfig.getConnection();

    public static void main(String[] args) throws SQLException{
        scalarHandler();
    }   
    /*
     *  結果集第六種處理方法,ScalarHandler
     *  對於查詢後,只有1個結果
     */
    public static void scalarHandler()throws SQLException{
        QueryRunner qr = new QueryRunner();
        String sql = "SELECT COUNT(*) FROM sort";

        //呼叫方法query,傳遞結果集處理實現類ScalarHandler
        long count = qr.query(con, sql, new ScalarHandler<Long>());
        System.out.println(count);
    }
}

15. 結果集處理MapHandler

1. 結果集處理MapHandler

案例程式碼
public class QueryRunnerDemo1 {
    private static Connection con = JDBCUtilsConfig.getConnection();

    public static void main(String[] args) throws SQLException{
        mapHandler();
    }
    /*
     *  結果集第七種處理方法,MapHandler
     *  將結果集第一行資料,封裝到Map集合中
     *  Map<鍵,值> 鍵:列名  值:這列的資料
     */
    public static void mapHandler()throws SQLException{
        QueryRunner qr = new QueryRunner();
        String sql = "SELECT  * FROM sort";

        //呼叫方法query,傳遞結果集實現類MapHandler
        //返回值: Map集合,Map介面實現類, 泛型
        Map<String,Object> map = qr.query(con, sql, new MapHandler());
        //遍歷Map集合
        for(String key : map.keySet()){
            System.out.println(key+".."+map.get(key));
        }
    }
}

16. 結果集處理MapListHandler

1. 結果集處理MapListHandlerr

案例程式碼
public class QueryRunnerDemo1 {
    private static Connection con = JDBCUtilsConfig.getConnection();

    public static void main(String[] args) throws SQLException{
        mapListHandler();
    }
    /*
     *  結果集第八種處理方法,MapListHandler
     *  將結果集每一行儲存到Map集合,鍵:列名,值:資料
     *  Map集合過多,儲存到List集合
     */
    public static void mapListHandler()throws SQLException{
        QueryRunner qr = new QueryRunner();
        String sql = "SELECT  * FROM sort";

        //呼叫方法query,傳遞結果集實現類MapListHandler
        //返回值List集合, 儲存的是Map集合
        List<Map<String,Object>> list = qr.query(con, sql, new MapListHandler());
        //遍歷集合list
        for( Map<String,Object> map : list ){
            for(String key : map.keySet()){
                System.out.print(key+"..."+map.get(key));
            }
            System.out.println();
        }
    }
}

17. 連線池介紹

1. 連線池介紹

連線池介紹
  1. 實際上就是存放連線的池子(容器)
  2. 在開發中“獲得連線”或“釋放資源”是非常消耗系統資源的兩個過程
  3. 為了解決此類效能問題,通常情況我們採用連線池技術,來共享連線Connection。
  4. 這樣我們就不需要每次都建立連線、釋放連線了,這些操作都交給了連線池

18. 連線池概念規範和DataSource介面

1. 連線池概念規範和DataSource介面

連線池概念規範
  1. 用池來管理Connection,這樣可以重複使用Connection。
  2. 不用自己來建立Connection,而是通過池來獲取Connection物件
  3. 使用完Connection後,呼叫Connection的close()方法也不會真的關閉Connection,而是把Connection“歸還”給池
  4. 連線池技術可以完成Connection物件的再次利用
DataSource介面
  1. Java為資料庫連線池提供了公共的介面:javax.sql.DataSource
  2. 各個廠商需要讓自己的連線池實現這個介面。這樣應用程式可以方便的切換不同廠商的連線池
  3. 常見的連線池:DBCP、C3P0

19. DBCP連線池介紹(Apache)

DBCP連線池介紹

DBCP連線池介紹
  1. DBCP也是一個開源的連線池,是Apache Common成員之一,在企業開發中也比較常見,tomcat內建的連線池
  2. tomcat伺服器簡單介紹

20. 匯入jar包

1. 匯入jar包

jar包介紹
  1. mysql-connector-java-5.1.37-bin.jar:資料庫驅動
  2. commons-dbutils-1.6.jar:提供QueryRunner類方便進行增刪改查操作
  3. commons-dbcp-1.4.jar:
  4. commons-pool-1.5.6.jar:提供高效的資料庫連線池技術
匯入jar包
  1. 在專案根路徑下建立資料夾lib
  2. 拷貝以上jar包,選定拷貝的jar包/右鍵/Build Path/Add to Build Path

21. BasicDataSource類的使用

1. BasicDataSource類的使用

案例程式碼
/*
 *  連線池jar包中,定義好一個類 BasicDataSource
 *  實現類資料來源的規範介面 javax.sql.DataSource
 */
public class DataSoruceDemo {
    public static void main(String[] args) {
        //建立DataSource介面的實現類物件
        //實現類, org.apache.commons.dbcp
        BasicDataSource dataSource = new BasicDataSource();
        //連線資料庫的4個最基本資訊,通過物件方法setXXX設定進來
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/mybase");
        dataSource.setUsername("root");
        dataSource.setPassword("123");
        try{
            //呼叫物件方法getConnection獲取資料庫的連線
            Connection con = dataSource.getConnection();
            System.out.println(con);
        } catch(SQLException ex){
            // System.out.println(ex);
            ex.printStackTrace();
            throw new RuntimeException("資料庫連線失敗");
        }
    }
}

22. BasicDataSource類的常見配置

BasicDataSource類的常見配置

常見配置
分類 屬性 描述
必須項 driverClassName 資料庫驅動名稱
- url 資料庫的地址
- username 使用者名稱
- password 密碼
基本項(擴充套件)
- maxActive 最大連線數量
- minIdle 最小空閒連線
- maxIdle 最大空閒連線
- initialSize 初始化連線

23. 實現資料庫連線池工具類

實現資料庫連線池工具類

案例程式碼
/*
 *  使用DBCP實現資料庫的連線池
 *  連線池配置,自定義類,
 *  最基本四項完整
 *  對於資料庫連線池其他配置,自定義
 */
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSource;

public class JDBCUtils{
    //創建出BasicDataSource類物件
    private static BasicDataSource datasource = new BasicDataSource();
        //靜態程式碼塊,物件BasicDataSource物件中的配置,自定義
    static{
        //資料庫連線資訊,必須的
        datasource.setDriverClassName("com.mysql.jdbc.Driver");
        datasource.setUrl("jdbc:mysql://localhost:3306/day33_user");
        datasource.setUsername("root");
        datasource.setPassword("123");
        //物件連線池中的連線數量配置,可選的
        datasource.setInitialSize(10);//初始化的連線數
        datasource.setMaxActive(8);//最大連線數量
        datasource.setMaxIdle(5);//最大空閒數
        datasource.setMinIdle(1);//最小空閒
    }

    //定義靜態方法,返回BasicDataSource類的物件
    public static DataSource getDataSource(){
        return datasource;
    }
}

24. 工具類的測試

工具類的測試

案例程式碼
/*
 *  測試寫好的工具類,
 *  提供的是一個DataSource介面的資料來源
 *  QueryRunner類構造方法,接收DataSource介面的實現類
 *  後面,呼叫方法update,query,無需傳遞他們Connection連線物件
 */

import java.sql.SQLException;
import java.util.List;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.ArrayListHandler;
import cn.itcast.jdbcutils.JDBCUtils;

public class QueryRunnerDemo{
    public static void main(String[] args) {
        select();
    }
    //定義2個方法,實現資料表的新增,資料表查詢
    //QueryRunner類物件,寫在類成員位置
    private static QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource()); 

    //資料表查詢
    public static void select(){
        String sql = "SELECT * FROM sort";
        try{
            List<Object[]> list = qr.query(sql, new ArrayListHandler());
            for(Object[] objs : list){
                for(Object obj : objs){
                    System.out.print(obj+"\t");
                }
                System.out.println();
            }
        } catch(SQLException ex){
            throw new RuntimeException("資料查詢失敗");
        }
    }

    //資料表新增資料
    public static void insert(){
        String sql = "INSERT INTO sort (sname,sprice,sdesc)VALUES(?,?,?)";
        Object[] params = {"水果",100.12,"剛剛上市的核桃"};
        try{
            int row = qr.update(sql, params);
            System.out.println(row);
        } catch(SQLException ex){
            throw new RuntimeException("資料新增失敗");
        }
    }
}

總結

資料庫工具的使用大大提升了我們開發人員的開發效率,善用技術,充實自我。