Spring JdbcTemplate實例

jopen 11年前發布 | 59K 次閱讀 Spring JEE框架 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級別記入入職。

  1. 如何獲取一個表中的所有行數:

int rowCount = jdbcTemplate.queryForInt("SELECT COUNT(*) FROMERM_CHILD2");

  1. 列出每列的值:

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"));

                  }

  1. 如何進行參數綁定

intcountOfActorsNamedJoe =jdbcTemplate.queryForInt(

                          "select count(*) from ERM_CHILD2 where CHILD2_COL3 = ?",new Object[]{"2"});

  1. 查詢一個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);

  1. 更新(插入/更新/刪除)

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)});

  1. 其他操作
jdbcTemplate.execute("create table mytable (id integer, name varchar(100))");

jdbcTemplate.update(

"call SUPPORT.REFRESH_ACTORS_SUMMARY(?)", 

new Object[]{Long.valueOf(unionId)});
 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!