數據庫連接池
連接池的概述
- 概念:其實就是一個容器(集合),存放數據庫連接的容器。
當系統初始化好后,容器被創建,容器中會申請一些連接對象,當用戶來訪問數據庫時,
從容器中獲取連接對象,用戶訪問完之后,會將連接對象歸還給容器。 - 好處:
- 節約資源
- 用戶訪問高效
- 節約資源
- 實現:
- 標准接口:DataSource javax.sql包下的
- 方法:
- 獲取連接:getConnection()
- 歸還連接:Connection.close()。如果連接對象Connection是從連接池中獲取的,那么調用Connection.close()方法,
則不會再關閉連接了。而是歸還連接
- 歸還連接:Connection.close()。如果連接對象Connection是從連接池中獲取的,那么調用Connection.close()方法,
- 獲取連接:getConnection()
- 一般我們不去實現它,有數據庫廠商來實現
- C3P0:數據庫連接池技術
- Druid:數據庫連接池實現技術,由阿里巴巴提供的
- 方法:
- 標准接口:DataSource javax.sql包下的
- C3P0:數據庫連接池技術
- 步驟:
- 導入jar包 (兩個) c3p0-0.9.5.2.jar mchange-commons-java-0.2.12.jar ,
- 不要忘記導入數據庫驅動jar包
- 定義配置文件:
- 名稱: c3p0.properties 或者 c3p0-config.xml
- 路徑:直接將文件放在src目錄下即可。
- 創建核心對象 數據庫連接池對象 ComboPooledDataSource
- 獲取連接: getConnection
- 導入jar包 (兩個) c3p0-0.9.5.2.jar mchange-commons-java-0.2.12.jar ,
- 代碼:
//1.創建數據庫連接池對象
DataSource ds = new ComboPooledDataSource();
//2. 獲取連接對象
Connection conn = ds.getConnection();
- 步驟:
- Druid:數據庫連接池實現技術,由阿里巴巴提供
- 步驟:
- 導入jar包 druid-1.0.9.jar
- 定義配置文件:
- 是properties形式的
- 可以叫任意名稱,可以放在任意目錄下
- 加載配置文件。Properties
- 獲取數據庫連接池對象:通過工廠來來獲取 DruidDataSourceFactory
- 獲取連接: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();
-
定義工具類
- 定義一個類 JDBCUtils
- 提供靜態代碼塊加載配置文件,初始化連接池對象
- 提供方法
- 獲取連接方法:通過數據庫連接池獲取連接
- 釋放資源
- 獲取連接池的方法
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=3000public 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的開發
- 步驟:
- 導入jar包
- 創建JdbcTemplate對象。依賴於數據源DataSource
- JdbcTemplate template = new JdbcTemplate(ds);
- 調用JdbcTemplate的方法來完成CRUD的操作
- update():執行DML語句。增、刪、改語句
- queryForMap():查詢結果將結果集封裝為map集合,將列名作為key,將值作為value 將這條記錄封裝為一個map集合
- 注意:這個方法查詢的結果集長度只能是1
- queryForList():查詢結果將結果集封裝為list集合
- 注意:將每一條記錄封裝為一個Map集合,再將Map集合裝載到List集合中
- query():查詢結果,將結果封裝為JavaBean對象
- query的參數:RowMapper
- 一般我們使用BeanPropertyRowMapper實現類。可以完成數據到JavaBean的自動封裝
- new BeanPropertyRowMapper<類型>(類型.class)
- query的參數:RowMapper
- 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(); }
}
-