Spring框架中org.springframework.jdbc.core包提供了JDBC模板類,其中JdbcTemplate是core包的核心類,其餘模板類都是基於它封裝完成的。 java
Spring除了提供JdbcTemplate核心類外,還提供了基於JdbcTemplate實現的NamedParameterJdbcTemplate類用於支持命名參數綁定、 SimpleJdbcTemplate類用於支持JDK5+的可變參數及自動裝箱拆箱等特性。本文主要介紹JdbcTemplate核心類。 spring
JdbcTemplate類主要提供如下四類方法: sql
下面將主要介紹query方法及queryForXXX方法的返回值和相關異常。 數據庫
首先咱們先大概瞭解下query方法及queryForXXX方法的調用層次。 app
下圖是不須要設置sql參數的方法的調用層次: 框架
下圖是須要設置sql參數的方法的調用層次: 函數
其中Object[] args就是設置參數用的,而int[] argTypes則是指定參數類型,參數類型定義在java.sql.Types類中。 性能
接下來咱們來看看不須要設置sql參數的查詢方法在0行1列,1行1列和5行1列結果集中的返回值 測試
|
0行1列 ui |
1行1列 |
5行1列 |
|
List query |
大小爲0的List |
大小爲1的List |
大小爲5的List |
|
Map queryForMap |
org.springframework.dao. |
以列名爲key,大小爲1的Map |
org.springframework.dao. |
|
Object queryForObject |
org.springframework.dao. |
Object |
org.springframework.dao. |
|
Object queryForObject |
org.springframework.dao. |
類型爲requiredType的Object |
org.springframework.dao. |
|
long queryForLong |
org.springframework.dao. |
long |
org.springframework.dao. |
|
int queryForInt |
org.springframework.dao. |
int |
org.springframework.dao. |
|
List queryForList |
大小爲0的List |
大小爲1的List |
大小爲5的List |
|
List queryForList |
大小爲0的List |
List中包含1個以列名爲key的Map |
List中包含5個以列名爲key的Map |
|
其中下面這些查詢方法支持多列結果集:
其餘不支持多列結果集的查詢方法則會拋出IncorrectResultSetColumnCountException異常。
設置sql參數的查詢方法的返回值和上述結果相似。
從上面的結果能夠看出只有返回值類型爲List的方法能夠接收零到多行結果集而不拋出異常,因此在使用query方法及queryForXXX方法時須要注意處理EmptyResultDataAccessException和IncorrectResultSizeDataAccessException這兩個異常,這兩個異常反映出數據庫表中數據可能出現了缺失或冗餘。若是返回值不符合指望值時,則須要排查業務流程或者數據了。
最後咱們來看看RowMapper接口,這個接口的實現類的功能是將結果集中的每一行數據封裝成用戶定義的結構,因此在查詢方法中常常會被用到。
Spring框架爲咱們提供了BeanPropertyRowMapper/ParameterizedBeanPropertyRowMapper,ColumnMapRowMapper和SingleColumnRowMapper這三大便利類。
BeanPropertyRowMapper類與ParameterizedBeanPropertyRowMapper類的功能徹底相同,當POJO對象和數據庫表字段徹底對應或者駝峯式與下劃線式對應時,該類會根據構造函數中傳遞的class來自動填充數據。只是ParameterizedBeanPropertyRowMapper類使用泛型須要JDK5+支持。這裏須要注意雖然這兩個類提供了便利,可是因爲使用反射致使性能降低,因此若是須要高性能則仍是須要本身去實現RowMapper接口來包裝數據。
ColumnMapRowMapper類返回一個List對象,對象中的每個元素都是一個以列名爲key的Map對象。
SingleColumnRowMapper類也返回一個List對象,對象中的每一個元素是數據庫中的某列的值。注意結果集必須是單列,否則會拋出IncorrectResultSetColumnCountException異常。
如今在Spring2.5.6.SEC02和JDK1.4環境下建個項目來了解下上述三個便利類。
創建數據庫表:
create table T_SPRINGJDBC_TEST ( my_number NUMBER, my_varchar VARCHAR2(10), my_date DATE )
插入5條測試數據:
新建一個Java項目,準備依賴Jar包,Spring配置文件appContext.xml,配置數據源。
創建POJO對象:
public class MyPojo { private long my_Number; private Date my_Date; private String my_Varchar; //本文在此處省略了setter和getter方法 public String toString() { return "MyPojo :{my_Number=" + my_Number + ", my_Date=" + my_Date + ", my_Varchar=" + my_Varchar + "}"; } }
創建帶main方法的類
先來了解BeanPropertyRowMapper類:
public static void main(String[] args) { ApplicationContext ctx = new FileSystemXmlApplicationContext( "classpath:appContext.xml"); DataSource dataSource = (DataSource) ctx.getBean("dataSource"); JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); List result = jdbcTemplate.query("select * from t_springjdbc_test", new BeanPropertyRowMapper(MyPojo.class)); System.out.println(result); }
輸出結果以下:
[MyPojo :{my_Number=1, my_Date=2013-10-10 01:00:00.0, my_Varchar=a}, MyPojo :{my_Number=2, my_Date=2013-10-11 02:00:00.0, my_Varchar=b}, MyPojo :{my_Number=3, my_Date=2013-10-12 03:00:00.0, my_Varchar=c}, MyPojo :{my_Number=4, my_Date=2013-10-13 04:00:00.0, my_Varchar=d}, MyPojo :{my_Number=5, my_Date=2013-10-14 05:00:00.0, my_Varchar=e}]
再來了解ColumnMapRowMapper類:
public static void main(String[] args) { ApplicationContext ctx = new FileSystemXmlApplicationContext( "classpath:appContext.xml"); DataSource dataSource = (DataSource) ctx.getBean("dataSource"); JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); List result = jdbcTemplate.query("select * from t_springjdbc_test", new ColumnMapRowMapper()); System.out.println(result); }
輸出結果爲:
[{MY_NUMBER=1, MY_VARCHAR=a, MY_DATE=2013-10-10 01:00:00.0}, {MY_NUMBER=2, MY_VARCHAR=b, MY_DATE=2013-10-11 02:00:00.0}, {MY_NUMBER=3, MY_VARCHAR=c, MY_DATE=2013-10-12 03:00:00.0}, {MY_NUMBER=4, MY_VARCHAR=d, MY_DATE=2013-10-13 04:00:00.0}, {MY_NUMBER=5, MY_VARCHAR=e, MY_DATE=2013-10-14 05:00:00.0}]
最後瞭解SingleColumnRowMapper類:
public static void main(String[] args) { ApplicationContext ctx = new FileSystemXmlApplicationContext( "classpath:appContext.xml"); DataSource dataSource = (DataSource) ctx.getBean("dataSource"); JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); List result = jdbcTemplate.query( "select my_number from t_springjdbc_test", new SingleColumnRowMapper()); System.out.println(result); }
輸出結果爲:
[1, 2, 3, 4, 5]
如今你們初步瞭解JdbcTemplate類中查詢方法了吧!