天天看點

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級别記入入職。

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

繼續閱讀