數據庫連接池(C3P0,Druid)、Spring JDBC的基本使用(二)

Content:

  • 數據庫連接池
    • C3P0:數據庫連接池技術
    • Druid:數據庫連接池實現技術,由阿里巴巴提供的
  • Spring JDBC : JDBC Template


概念:

1)DBCP
  DBCP是一個依賴Jakarta commons-pool對象池機制的數據庫連接池.DBCP可以直接的在應用程序中使用,Tomcat的數據源使用的就是DBCP。
2)c3p0
  c3p0是一個開放源代碼的JDBC連接池,它在lib目錄中與Hibernate一起發佈,包括了實現jdbc3和jdbc2擴展規範說明的Connection 和Statement 池的DataSources 對象。
3)Druid
  阿里出品,淘寶和支付寶專用數據庫連接池,但它不僅僅是一個數據庫連接池,它還包含一個ProxyDriver,一系列內置的JDBC組件庫,一個 SQL Parser。支持所有JDBC兼容的數據庫,包括Oracle、MySql、Derby、Postgresql、SQL Server、H2等等。Druid針對Oracle和MySql做了特別優化,比如Oracle的PS Cache內存佔用優化,MySql的ping檢測優化。Druid提供了MySql、Oracle、Postgresql、SQL-92的SQL的完整支持,這是一個手寫的高性能SQL Parser,支持Visitor模式,使得分析SQL的抽象語法樹很方便。簡單SQL語句用時10微秒以內,複雜SQL用時30微秒。通過Druid提供的SQL Parser可以在JDBC層攔截SQL做相應處理,比如說分庫分表、審計等。Druid防禦SQL注入攻擊的WallFilter就是通過Druid的SQL Parser分析語義實現的。
4)Spring JDBC : JDBC Template鏈接: 原理.
  Spring對數據庫的操作在jdbc上面做了深層次的封裝,使用spring的注入功能,可以把DataSource註冊到JdbcTemplate之中。
  JDBC已經能夠滿足大部分用戶最基本的對數據庫的需求,但是在使用JDBC時,應用必須自己來管理數據庫資源。Spring對數據庫操作需求提供了很好的支持,並在原始JDBC基礎上,構建了一個抽象層,提供了許多使用JDBC的模板和驅動模塊,爲Spring應用操作關係數據庫提供了更大的便利。

(一)C3p0連接池:

 * 使用步驟:
        1. 導入jar包 (兩個) c3p0-0.9.5.2.jar mchange-commons-java-0.2.12.jar ,
            * 不要忘記導入數據庫驅動jar包
        2. 定義配置文件:
            * 名稱: c3p0.properties 或者 c3p0-config.xml
            * 路徑:直接將文件放在src目錄下即可。

        3. 創建核心對象 數據庫連接池對象 ComboPooledDataSource
        4. 獲取連接: getConnection
   * 代碼:
         //1.創建數據庫連接池對象
        DataSource ds  = new ComboPooledDataSource();
        //2. 獲取連接對象
        Connection conn = ds.getConnection();
  • 實現demo:
/**
 * @author 
 * @date 2019-12-31 17:18
 * @fun C3p0連接池使用步驟:
 *      1.導入兩個c3p0包和一個MySQL驅動包,並添加依賴
 *      2.定義配置文件
 *      3.創建連接池對象
 *      4.獲取連接對象
 */
public class C3p0 {
    public static void main(String[] args) throws SQLException {
        //1.創建數據庫連接池對象
        ComboPooledDataSource ds = new ComboPooledDataSource();
        //2.獲取連接對象
        Connection con = ds.getConnection();
        //3.打印
        System.out.println(con);
    }
}

程序結構


(二)Druid 連接池:

demo1:打印連接對象con

/**
 * @author cw
 * @date 2020-01-02 08:58
 * @fun :打印連接
 * 		1. 導入jar包 druid-1.0.9.jar
        2. 定義配置文件:
                * 是properties形式的
                * 可以叫任意名稱,可以放在任意目錄下
        3. 加載配置文件。Properties
        4. 獲取數據庫連接池對象:通過工廠來來獲取  DruidDataSourceFactory
        5. 獲取連接:getConnection
 */


public class Druid {
    public static void main(String[] args) throws Exception {
        //加載配置文件
        Properties pro = new Properties();
        InputStream is = Druid.class.getClassLoader().getResourceAsStream("druid.properties");
        pro.load(is);
        //獲取連接池對象
        DataSource ds = DruidDataSourceFactory.createDataSource(pro);
        //獲取連接
        Connection con = ds.getConnection();
        //打印連接
        System.out.println(con);
    }
}

demo2:使用工具類,druid連接池,給數據庫db3,中的account表添加一條記錄


  • 實現思路:

    1. 步驟:
      1. 導入jar包 druid-1.0.9.jar
      2. 定義配置文件:
      * 是properties形式的
      * 可以叫任意名稱,可以放在任意目錄下
      3. 加載配置文件。Properties
      4. 獲取數據庫連接池對象:通過工廠來來獲取 DruidDataSourceFactory
      5. 獲取連接:getConnection
      • 代碼:
        //3.加載配置文件
        Properties pro = new Properties();
        InputStream is = DruidDemo.class.getClassLoader().getResourceAsStream(“druid.properties”);
        pro.load(is);
        //4.獲取連接池對象
        DataSource ds = DruidDataSourceFactory.createDataSource(pro);
        //5.獲取連接
        Connection conn = ds.getConnection();
    2. 定義工具類
      1. 定義一個類 JDBCUtils
      2. 提供靜態代碼塊加載配置文件,初始化連接池對象
      3. 提供方法
        1. 獲取連接方法:通過數據庫連接池獲取連接
        2. 釋放資源
        3. 獲取連接池的方法

  • 1、入口:DruidDemo2

/**
 * @author 
 * @date 2020-01-02 10:06
 * 使用新的工具類
 */
public class DruidDemo2 {
    public static void main(String[] args) {
        /*
         *使用工具類,給數據庫db3,中的account表添加一條記錄
         */
        Connection con = null;
        PreparedStatement pstmt = null;

        try {
            //1.獲取連接
            con = JDBCUtils.getConnection();
            //2.定義sql
            String sql = "insert into account values(null,?,?)";
            //3.獲取pstmt對象,執行sql
            pstmt = con.prepareStatement(sql);
            //4.給?賦值
            pstmt.setString(1,"xiaoming");
            pstmt.setDouble(2,5000);
            //5.執行sql插入語句
            int i = pstmt.executeUpdate();
            System.out.println(i);

        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            //6.釋放資源
            JDBCUtils.close(pstmt,con);
        }
    }
}

  • 2.工具類:JDBCUtils
/**
 * @author 
 * @date 2020-01-02 09:21
 * @fun 工具類
 *  1. 定義一個類 JDBCUtils
    2. 提供靜態代碼塊加載配置文件,初始化連接池對象
    3. 提供方法
        1. 獲取連接方法:通過數據庫連接池獲取連接
        2. 釋放資源
        3. 獲取連接池的方法
 */
public class JDBCUtils {
    // 定義成員變量:連接池對象ds
    private static DataSource ds;
    static {

        try {
            //加載配置文件
            Properties pro = new Properties();
            pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
            //通過工廠創建連接池對象ds
            ds = DruidDataSourceFactory.createDataSource(pro);

        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 獲取連接
     * @return con
    */
    public static Connection getConnection() throws SQLException {
        return ds.getConnection();
    }

    /**
     * 關閉資源
     * @return
    */
    public static void close(Statement stat, Connection con){
        close(null,stat,con);
    }

    //方法重載
    public static void close(ResultSet rs, Statement stat,Connection con){
        if (rs != null) {
            try {
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (stat != null) {
            try {
                stat.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (con != null) {
            try {
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

    }

    /**
     * 獲取連接池的方法
     * @return
    */
    public static DataSource getDataSource(){
        return ds;
    }

}

  • 3、通過配置文件的方式,讀取相關信息:
    druid.properties(文件名稱可自定義,放置路徑爲本項目任意位置)
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///db3
username=root
password=root
# 初始化連接數
initialSize=5
# 最大連接數
maxActive=10
#最大等待時間
maxWait=3000



(三)Spring JDBC

  • Spring框架對JDBC的簡單封裝。提供了一個JDBCTemplate對象簡化JDBC的開發操作步驟:
  • 步驟:
    1. 導入jar包
    2. 創建JdbcTemplate對象。依賴於數據源DataSource
        * JdbcTemplate template = new JdbcTemplate(ds);

    3. 調用JdbcTemplate的方法來完成CRUD的操作
        * update():執行DML語句。增、刪、改語句
        * queryForMap():查詢結果將結果集封裝爲map集合,將列名作爲key,將值作爲value 將這條記錄封裝爲一個map集合
            * 注意:這個方法查詢的結果集長度只能是1
        * queryForList():查詢結果將結果集封裝爲list集合
            * 注意:將每一條記錄封裝爲一個Map集合,再將Map集合裝載到List集合中
        * query():查詢結果,將結果封裝爲JavaBean對象
            * query的參數:RowMapper
                * 一般我們使用BeanPropertyRowMapper實現類。可以完成數據到JavaBean的自動封裝
                * new BeanPropertyRowMapper<類型>(類型.class)
        * queryForObject:查詢結果,將結果封裝爲對象
            * 一般用於聚合函數的查詢

快速實現:

/**
 * @author 
 * @date 2020-01-02 11:06
 * JdbcTemplate入門(springframework)
 */
public class JdbcTemplateDemo1 {
    public static void main(String[] args) {
        //1.導5個包
        //2.創建JdbcTemplate 的對象,依賴數據源dataSourse
        JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());  
        //JDBCUtils.getDataSource()上面實現的工具類,傳遞ds數據庫連接池資源
        //3.調用JdbcTemplate的方法來完成CRUD的操作
        String sql = "update account set balance = 20000 where id  = ?";
        int i = template.update(sql, 5);
        System.out.println(i);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章