本章內容
- 數據庫連接池
- Spring JDBC : JDBC Template
一、數據庫連接池
- 概念:其實就是一個容器(集合),存放數據庫連接的容器。當系統初始化好後,容器被創建,容器中會申請一些連接對象,當用戶來訪問數據庫時,從容器中獲取連接對象,用戶訪問完之後,會將連接對象歸還給容器。
- 好處:
①節約資源
③用戶訪問高效 - 實現:
①標準接口:DataSource javax.sql包下的
②一般我們不去實現它,有數據庫廠商來實現//獲取連接: getConnection() //歸還連接,如果連接對象Connection是從連接池中獲取的,那麼調用 Connection.close()方法,則不會再關閉連接了,而是歸還連接 Connection.close()。
(1)C3P0:數據庫連接池技術
(2)Druid:數據庫連接池實現技術,由阿 裏巴巴提供的 - 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
③注意:c3p0-config.xml中可以有多個配置,獲取連接對象的時候可以指定名字//1.創建數據庫連接池對象 DataSource ds = new ComboPooledDataSource(); //2. 獲取連接對象 Connection conn = ds.getConnection();
//1.創建數據庫連接池對象 DataSource ds = new ComboPooledDataSource(); //2. 獲取連接對象 Connection conn = ds.getConnection("otherc3p0");
- Druid:數據庫連接池實現技術,由阿里巴巴提供的
①步驟:
②代碼:1. 導入jar包 druid-1.0.9.jar 2. 定義配置文件: 是properties形式的 可以叫任意名稱,可以放在任意目錄下 3. 加載配置文件:Properties 4. 獲取數據庫連接池對象:通過工廠來來獲取 DruidDataSourceFactory 5. 獲取連接:getConnection
//1.導入jar包 //2.定義配置文件druid.properties //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
②提供靜態代碼塊加載配置文件,初始化連接池對象
③提供方法
(1)獲取連接方法:通過數據庫連接池獲取連接
(2)釋放資源
(3)獲取連接池的方法
代碼:package cn.itcast.datasource.utils; import com.alibaba.druid.pool.DruidDataSourceFactory; import javax.sql.DataSource; import java.io.IOException; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties; /** * Druid工具類 */ public class JDBCUtil { //1.定義成員變量 DataSource private static DataSource ds; static { try { //1.加載配置文件 Properties pro = new Properties(); pro.load(JDBCUtil.class.getClassLoader().getResourceAsStream("druid.properties")); //2.獲取DataSource ds = DruidDataSourceFactory.createDataSource(pro); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } /** * 獲取連接 */ public static Connection getConnection() throws SQLException { return ds.getConnection(); } /** * 釋放資源 */ 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(); } }*/ close(null, stmt, 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(); } } } /** * 獲取連接池方法 */ public static DataSource getDataSource() { return ds; } }
二、Spring JDBC
概念: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) queryForObject:查詢結果,將結果封裝爲對象 * 一般用於聚合函數的查詢
④練習:
需求:
1. 修改1號數據的 salary 爲 10000 2. 添加一條記錄 3. 刪除剛纔添加的記錄 4. 查詢id爲1的記錄,將其封裝爲Map集合 5. 查詢所有記錄,將其封裝爲List 6. 查詢所有記錄,將其封裝爲Emp對象的List集合 7. 查詢總記錄數
代碼:
package cn.itcast.jdbctemplate; import cn.itcast.datasource.utils.JDBCUtil; import cn.itcast.jdbctemplate.domain.Emp; import org.junit.Test; import org.springframework.jdbc.core.BeanPropertyRowMapper; import org.springframework.jdbc.core.JdbcTemplate; import java.util.List; import java.util.Map; public class JdbcTemplateDemo2 { private JdbcTemplate jt = new JdbcTemplate(JDBCUtil.getDataSource()); //使用junit可以使方法單獨執行 //1. 修改1號數據的 salary 爲 10000 @Test public void test1() { String sql = "update employee set salary = 10000 where id = 1"; int count = jt.update(sql); System.out.println(count); } //2. 添加一條記錄 @Test public void test2() { String sql = "insert into employee values(?,?,?,?,?)"; int conut = jt.update(sql, 5, "anfly", "男", 20, 20000); System.out.println(conut); } //3. 刪除剛纔添加的記錄 @Test public void test3() { String sql = "delete from employee where id = 5"; int conut = jt.update(sql); System.out.println(conut); } //4. 查詢id爲1的記錄,將其封裝爲Map集合 // 注意:這個方法的結果長度只能是1 @Test public void test4(){ String sql = "select * from employee where id = ?"; Map<String, Object> map = jt.queryForMap(sql, 1); System.out.println(map); } //5. 查詢所有記錄,將其封裝爲List @Test public void test5(){ String sql = "select * from employee"; List<Map<String, Object>> list = jt.queryForList(sql); System.out.println(list); } //6. 查詢所有記錄,將其封裝爲Emp對象的List集合 @Test public void test6(){ String sql = "select * from employee"; List<Emp> list = jt.query(sql, new BeanPropertyRowMapper<Emp>(Emp.class)); System.out.println(list); } //7. 查詢總記錄數 @Test public void test7(){ String sql = "select count(*) from employee"; Long count = jt.queryForObject(sql, Long.class); System.out.println(count); } }