Spring JdbcTemplate實例
Spring JdbcTemplate實例
JDBCTemplate:是經典的也是最常用的Spring對于JDBC訪問的方案。這也是最低級別的封裝,其他的工作模式事實了在底層使用了JdbcTemplate作為其底層的實現基礎。
Spring Framework的JDBC抽象框架由四個包構成:core,dataSource,ovject and support。org.springframework.jdbc.core包由JdbcTemplate類以及相關的回調接口(callback interface)和類組成。
org.springframework.jdbc.datasource包提供了一些工具類來簡化對DataSource的訪問。同時提供了多種簡單的DataSource實現。這些實現可以脫離J2EE容器進行獨立測試和運行。這些工具類提供了一些靜態方法,允許你通過JDNI來獲取數據庫連接和關閉連接。同時支持綁定到當前線程的數據庫連接,例如使用DataSourceTransactionManager。
org.springframework.jdbc.object包包含了一些類,用于將RDBMS查詢,更新以及存儲過程表述為一些可重用的,線程安全的對象,這種方式通過JDO進行模型化,不過這些通過查詢返回的對象是與數據庫脫離的對象,這種對于JDBC的高層次的封裝是基于 org.springframework.jdbc.core包對JDBC的低層次封裝之上的。
org.springframework.jdbc.support包定義了SQLException轉化類以及一些其他的工具類。
在JDBC調用過程中所拋出的異常都會被轉化為在org.springframework.dao包中定義的異常。也就是說,凡是使用Spring 的JDBC封裝層的代碼無需實現任何JDBC或者RDBMS相關的異常處理,所有的這些被轉化的異常都是unchecked異常,因而也給了你一種額外的選擇,就是可以抓住這些異常,從而轉化成其他類型的異常被允許調用者傳播。
JdbcTemplate是core包的核心類。它替我們完成了資源的創建以及釋放工作,從而簡化了我們對JDBC的使用。它還可以幫助我們避免一些常見的錯誤,比如忘記關閉數據庫連接。JdbcTemplate將完成JDBC核心處理流程,比如SQL語句的創建,執行,而把SQL語句的生成以及查詢結果的提取工作留給我們的應用代碼。它可以完成SQL查詢,更新以及調用存儲過程,可以對ResultSet進行遍歷并加以提取。它還可以捕獲JDBC 異常并將其轉換成org.springframework.dao包中定義的,通用的,信息更豐富的異常。
使用JdbcTemplate進行編碼只需要根據明確定義的一組契約來實現回調接口。PreparedStatementCreator回調接口通過給定的Connection創建一個PreparedStatement,包含SQL和任何相關的參數。 CallableStatementCreateor實現同樣的處理,只不過它創建的是CallableStatement。 RowCallbackHandler接口則從數據集的每一行中提取值。我們可以在DAO實現類中通過傳遞一個DataSource引用來完成 JdbcTemplate的實例化,也可以在Spring的IOC容器中配置一個JdbcTemplate的bean并賦予DAO實現類作為一個實例,需要注意的是DataSource在Spring的IOC容器中總是配成一個bean,第一種情況下,DataSource bean將傳遞給service,第二種情況下DataSource bean 傳遞給JdbcTemplate bean。
最后JdbcTemplate中使用的所有SQL將會以DEBUG級別記入入職。
- 如何獲取一個表中的所有行數:
int rowCount = jdbcTemplate.queryForInt("SELECT COUNT(*) FROMERM_CHILD2");
- 列出每列的值:
Stringsql = "SELECT * FROM ERM_CHILD1";
List<Map<String,Object>> rows = jdbcTemplate.queryForList(sql);
for (Map row : rows) {
System.out.println(row.get("CHILD1_COL1"));
System.out.println(row.get("CHILD1_COL2"));
System.out.println(row.get("CHILD1_COL3"));
System.out.println(row.get("CHILD1_COL4"));
}
- 如何進行參數綁定
intcountOfActorsNamedJoe =jdbcTemplate.queryForInt(
"select count(*) from ERM_CHILD2 where CHILD2_COL3 = ?",new Object[]{"2"});
- 查詢一個String
Map<String,Object> results =
jdbcTemplate.queryForMap(
"selectCHILD2_COL1,CHILD2_COL2 from ERM_CHILD2 where CHILD2_COL1 = ? "
,new Object[]{new BigDecimal(501)});
String column1 = (String)jdbcTemplate.queryForObject("selectCHILD2_COL2 from ERM_CHILD2 where CHILD2_COL1 = ?", new Object[]{newBigDecimal(501)}, String.class);
- 更新(插入/更新/刪除)
jdbcTemplate.update(
"insertinto ERM_CHILD1 (CHILD1_COL1,CHILD1_COL2,CHILD1_COL3,CHILD1_COL4) values(?,?,?,?)",
new Object[] {999,"1","2","3"});
int rows = jdbcTemplate.update(
"UPDATEERM_CHILD1 SET CHILD1_COL1 = ? WHERE CHILD1_COL1 = ?",
new Object[] {“444”,new BigDecimal(999)});
int rows = jdbcTemplate.update(
"DELETEFROM ERM_CHILD1 WHERE CHILD1_COL1 =?",
new Object[] {new BigDecimal(999)});
- 其他操作
jdbcTemplate.execute("create table mytable (id integer, name varchar(100))"); jdbcTemplate.update( "call SUPPORT.REFRESH_ACTORS_SUMMARY(?)", new Object[]{Long.valueOf(unionId)});