1. 程式人生 > >Java之JDBC連接池

Java之JDBC連接池

() line 釋放 aso jdbcutils con println new cut

數據庫連接池

連接池的概述

  1. 概念:其實就是一個容器(集合),存放數據庫連接的容器。
    當系統初始化好後,容器被創建,容器中會申請一些連接對象,當用戶來訪問數據庫時,
    從容器中獲取連接對象,用戶訪問完之後,會將連接對象歸還給容器。
  2. 好處:
    • 節約資源
      • 用戶訪問高效
  3. 實現:
    1. 標準接口:DataSource javax.sql包下的
      1. 方法:
        • 獲取連接:getConnection()
          • 歸還連接:Connection.close()。如果連接對象Connection是從連接池中獲取的,那麽調用Connection.close()方法,
            則不會再關閉連接了。而是歸還連接
      2. 一般我們不去實現它,有數據庫廠商來實現
        1. C3P0:數據庫連接池技術
        2. Druid:數據庫連接池實現技術,由阿裏巴巴提供的
  4. 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();
  5. Druid:數據庫連接池實現技術,由阿裏巴巴提供
    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();
    1. 定義工具類
      1. 定義一個類 JDBCUtils
      2. 提供靜態代碼塊加載配置文件,初始化連接池對象
      3. 提供方法
        1. 獲取連接方法:通過數據庫連接池獲取連接
        2. 釋放資源
        3. 獲取連接池的方法

      driverClassName=com.mysql.jdbc.Driver
      url=jdbc:mysql://127.0.0.1:3306/db3?useSSL=true
      username=root
      password=root
      initialSize=5
      maxActive=10
      maxWait=3000

      public class JDBCUtils {

        /**
         * 定義數據源
         */
        private static DataSource ds;
      
        static {
            try {
                /**
                 * 加載配置文件
                 */
                InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");
                Properties pro = new Properties();
                pro.load(is);
                /**
                 * 獲取數據源
                 */
                ds = DruidDataSourceFactory.createDataSource(pro);
      
            } catch (IOException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
      
        /**
         * 獲取數據源
         * @return 返回數據源
         */
        public static DataSource getDataSource(){
            return ds;
        }
      
        /**
         * 獲取連接對象
         * @return 返回連接對象
         * @throws SQLException  拋出的編譯異常
         */
        public static Connection getConn() throws SQLException {
            return ds.getConnection();
        }
      
        /**
         *  關閉連接
         * @param stmt  sql執行對象
         * @param conn  數據庫連接對象
         */
        public static void close(Statement stmt, Connection conn){
            if(stmt != null){
                try {
                    stmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
      
            if(conn != null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
      
        /**
         * 關閉資源的重載方法
         * @param rs    處理結果集的對象
         * @param stmt  執行sql語句的對象
         * @param conn  連接數據庫的對象
         */
        public static void close(ResultSet rs, Statement stmt, Connection conn){
      
            if(rs != null){
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
      
            if(stmt != null){
                try {
                    stmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
      
            if(conn != null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }

      }

JdbcTemplate

  • Spring框架對JDBC的簡單封裝。提供了一個JDBCTemplate對象簡化JDBC的開發
  • 步驟:
    1. 導入jar包
    2. 創建JdbcTemplate對象。依賴於數據源DataSource
    • JdbcTemplate template = new JdbcTemplate(ds);
    1. 調用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:查詢結果,將結果封裝為對象
      • 一般用於聚合函數的查詢
        public class SpringJdbcTemplateTest {
        private static JdbcTemplate jdbcTemplate;

         @Before
         public void init(){
             // 1. 導入jar包
             // 2. 創建JDBCTemplate對象
             jdbcTemplate = new JdbcTemplate(JdbcUtils.getDataSource());
         }
        
         @Test
         public void testInsert(){
             // 創建sql
             String sql = "INSERT INTO ACCOUNT VALUES(NULL,?,?)";
             // 執行sql,返回影響的行數
             int lines = jdbcTemplate.update(sql, "王五", 5000);
             System.out.println("影響的行數為:" + lines);
         }
        
         @Test
         public void testUpdate(){
             // 創建sql
             String sql = "UPDATE ACCOUNT SET BALANCE = ? WHERE ID = ?";
             // 執行sql,返回影響的行數
             int lines = jdbcTemplate.update(sql, 3000, 3);
             System.out.println("影響的行數為:" + lines);
         }
        
         @Test
         public void testDelete(){
             // 創建sql
             String sql = "DELETE FROM ACCOUNT WHERE ID = ?";
             // 執行sql,返回影響的行數
             int lines = jdbcTemplate.update(sql, 3);
             System.out.println("影響的行數為:" + lines);
         }
        
         @Test
         public void testQueryForMap(){
             // 3. 創建sql
             String sql = "SELECT * FROM STUDENT WHERE ID = ?";
             // 4. 使用查詢語句進行查詢(變長參數替換占位符)
             Map<String, Object> map = jdbcTemplate.queryForMap(sql,7);
             System.out.println(map);
         }
        
         @Test
         public void testQueryForList(){
             // 創建sql語句
             String sql = "SELECT * FROM STUDENT";
             // 執行sql,返回結果
             List<Map<String, Object>> list = jdbcTemplate.queryForList(sql);
             // 處理結果
             for (Map<String, Object> map : list) {
                 System.out.println(map);
             }
         }
        
         /**
          * queryForMap:將結果封裝成Map,只能返回一條結果,
          * 列名為Key,對應的值為Value
          */
         @Test
         public void testQuery(){
             // 創建sql
             String sql = "SELECT * FROM ACCOUNT";
             // 執行sql(使用BeanPropertyRowMapper實現類。可以完成數據到JavaBean的自動封裝)
             List<Account> accounts = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(Account.class));
             // 處理結果
             for (Account account : accounts) {
                 System.out.println(account);
             }
         }
        
         @Test
         public void testQueryForObject(){
             // 創建sql
             String sql = "SELECT COUNT(ID) FROM ACCOUNT";
             // 執行sql,一般用於查詢聚合函數()
             Long count = jdbcTemplate.queryForObject(sql,Long.class);
             System.out.println();
         }

        }

Java之JDBC連接池