數據庫連接池
概述:管理數據庫連接
作用:提高項目的性能
原理:在系統初始化的時候,將數據庫連接作為對象存儲在內存中,當用戶需要訪問數據庫時,從連接池中取出一個已建立的空閑連接對象。使用完畢后,將連接放回連接池中,以供下一個請求訪問使用
☆必須導入(mysql-connector-java-5.1.40-bin.jar和mchange-commons-java-0.2.11.jar);
☆所有的連接池必須實現一個接口:java.sql.DataSource
☆獲取連接的方法:Connection getConnection();
☆歸還連接的方法:XXX.close();
常用的數據庫連接池有:DBCP和C3P0
DBCP使用步驟:
1.導入jar包(commons-dbcp-1.4.jar和commons-pool-1.5.6.jar)
2.使用api
a.硬編碼
1 //創建連接池 2 BasicDataSource source=new BasicDataSource(); 3 4 //配置信息 5 source.setDriverClassName("com.mysal.jdbc.Driver"); 6 source.setUrl("jdbc:mysql://localhost:3306/需要連接的數據庫名稱"); 7 source.setUsername("數據庫登錄名稱"); 8 source.setPassword("數據庫登錄密碼"); 9 10 //獲取連接 11 Connection connection=source.getConnection(); 12 13 //設置SQL語句 14 String sql=" "; 15 16 //編寫預處理語句 17 prepareStatement prepare=connection.prepareStatement(sql);
b.配置文件
先編寫一個properties文件或Xml文件
1 //聲明配置 2 Properties properties=new Properties(); 3 properties.load(new FileInputStream("配置文件的位置")); 4 5 //創建連接池 6 DataSource source=new BasicDataSourceFactory(); 7 8 //獲取連接 9 Connection connection=source.getConnection(); 10 11 //設置SQL語句 12 String sql=" "; 13 14 //編寫預處理語句 15 prepareStatement prepare=connection.prepareStatement(sql);
c3p0使用步驟:
1.導入jar包(c3p0-0.9.1.2.jar);
a.使用硬編碼
1 //創建連接池 2 ComboPooledDataSource source=new ComboPooledDataSource(); 3 4 //設置參數 5 source.setDriverClass(com.mysql.jdbc.Driver); 6 source.setJdbcUrl("jdbc:mysql://localhost:3306/需要連接的數據庫名稱"); 7 source.setUser("數據庫登錄賬號"); 8 source.setPassword("數據庫登錄密碼"); 9 10 //獲取連接 11 Connection connection=source.getConnection(); 12 13 //設置SQL語句 14 String sql= " "; 15 16 //編寫預處理語句 17 PreparedStatement st=connection.prepareStatement(sql);
b.配置文件
配置文件的名稱(必須):c3p0.properties 或者 c3p0-config.xml
配置文件的路徑(必須):src下
1 //創建連接池 2 ComboPooledDataSource source=new CombopooledDataSource(); 3 4 //獲取連接 5 Connection connection=source.getConnection(); 6 7 //設置SQL語句 8 String sql= " "; 9 10 //編寫預處理語句 11 PreparedStatement st=connection.prepareStatement(sql);
使用dbutils
dbutils是apache組織的一個工具類,更放方便我們使用
使用步驟
1.導入jar包(commons-dbutils-1.4.jar);
2.創建QueryRunner類
3.編寫sql
4.執行sql query(....)執行r操作 updata(....)執行c u d操作
核心類和接口:
QueryRunner:類名
作用:操作sql語句
構造器:
new QueryRunner(Datasource ds);
注意:
底層幫我們創建連接,創建語句執行者 ,釋放資源.
常用方法:
query(..):
update(..):
DbUtils:釋放資源,控制事務 類
closeQuietly(conn):內部處理了異常
commitAndClose(Connection conn):提交事務並釋放連接
ResultSetHandler:封裝結果集 接口
ArrayHandler, 將查詢結果的第一條記錄封裝成數組,返回
ArrayListHandler, 將查詢結果的每一條記錄封裝成數組,將每一個數組放入list中返回
BeanHandler, 將查詢結果的第一條記錄封裝成指定的bean對象,返回
BeanListHandler, 將查詢結果的每一條記錄封裝成指定的bean對象,將每一個bean對象放入list中 返回.
ColumnListHandler, 將查詢結果的指定一列放入list中返回
MapHandler, 將查詢結果的第一條記錄封裝成map,字段名作為key,值為value 返回
MapListHandler, 將查詢結果的每一條記錄封裝map集合,將每一個map集合放入list中返回
ScalarHandler,針對於聚合函數 例如:count(*) 返回的是一個Long值
dbutils案例:
1 import java.sql.SQLException; 2 import java.util.List; 3 import java.util.Map; 4 5 import org.apache.commons.dbutils.QueryRunner; 6 import org.apache.commons.dbutils.handlers.BeanHandler; 7 import org.apache.commons.dbutils.handlers.BeanListHandler; 8 import org.apache.commons.dbutils.handlers.MapHandler; 9 import org.apache.commons.dbutils.handlers.MapListHandler; 10 import org.junit.Test; 11 12 import com.jdbc.utlis.Category; 13 import com.jdbc.utlis.DataSourceUtils; 14 15 public class dbUtils { 16 @Test 17 public void insert(){ 18 //創建queryRunner類 19 QueryRunner queryRunner = new QueryRunner(DataSourceUtils.getDataSource()); 20 //編寫sql 21 String sql="INSERT INTO user VALUES(9,'東尼大木和周傑倫')"; 22 try { 23 //執行sql; 24 int update = queryRunner.update(sql); 25 System.out.println(update); 26 } catch (SQLException e) { 27 // TODO Auto-generated catch block 28 e.printStackTrace(); 29 } 30 } 31 @Test 32 public void select(){ 33 //創建queryRunner類 34 QueryRunner queryRunner = new QueryRunner(DataSourceUtils.getDataSource()); 35 //編寫sql 36 String sql="select * from user "; 37 //執行sql; 38 try { 39 List<Map<String, Object>> query = queryRunner.query(sql, new MapListHandler()); 40 for (Object object : query) { 41 System.out.println(object); 42 } 43 44 } catch (SQLException e) { 45 // TODO Auto-generated catch block 46 e.printStackTrace(); 47 } 48 } 49 }
dbutils在使用時用到的工具類:
☆工具類在使用時需要導入c3p0的jar包並配置c3p0的配置文件用於連接數據庫
1 package com.jdbc.utlis; 2 3 import java.sql.Connection; 4 import java.sql.ResultSet; 5 import java.sql.SQLException; 6 import java.sql.Statement; 7 8 import javax.sql.DataSource; 9 10 import com.mchange.v2.c3p0.ComboPooledDataSource; 11 12 public class DataSourceUtils { 13 private static ComboPooledDataSource dataSource=new ComboPooledDataSource(); 14 /** 15 * 獲取數據源 16 * @return ComboPooledDataSource 連接池 17 */ 18 public static DataSource getDataSource(){ 19 return dataSource; 20 21 } 22 /** 23 * 24 * 獲取連接 25 * @return 連接 26 * @throws SQLException 27 */ 28 public static Connection getConnection() throws SQLException{ 29 return dataSource.getConnection(); 30 } 31 /** 32 * 釋放資源 33 * @param Connection,Statement,ResultSet 34 */ 35 public static void closeResource(Connection connection,Statement statement,ResultSet resultSet){ 36 closeResultSet(resultSet); 37 closeStatent(statement); 38 closeConnection(connection); 39 } 40 /** 41 * 釋放資源 42 * @param Connection 43 */ 44 public static void closeConnection(Connection connection){ 45 if(connection!=null){ 46 try { 47 connection.close(); 48 } catch (SQLException e) { 49 // TODO Auto-generated catch block 50 e.printStackTrace(); 51 } 52 } 53 connection=null; 54 } 55 /** 56 * 釋放資源 57 * @param Statement 58 */ 59 public static void closeStatent(Statement statement){ 60 if(statement!=null){ 61 try { 62 statement.close(); 63 } catch (SQLException e) { 64 // TODO Auto-generated catch block 65 e.printStackTrace(); 66 } 67 } 68 statement=null; 69 } 70 /** 71 * 釋放資源 72 * @param ResultSet 73 */ 74 public static void closeResultSet(ResultSet resultSet){ 75 if(resultSet!=null){ 76 try { 77 resultSet.close(); 78 } catch (SQLException e) { 79 // TODO Auto-generated catch block 80 e.printStackTrace(); 81 } 82 } 83 resultSet=null; 84 } 85 }
