一、spring提供了一組數據訪問框架,集成了多種數據訪問技術。支持JDBC、ibatis、hibernate、jpa等持久化框架。java
二、spring的數據訪問哲學spring
spring的目標之一就是容許開發人員在開發應用程序時,可以遵循面向對象原則中的「針對接口編程」。spring對數據訪問的支持也不例外。DAO是數據訪問對象(data access object)的縮寫,DAO提供了數據讀取和寫入到數據庫中的一種方式。他們以接口的方式發佈功能,應用程序的其餘部分能夠經過接口來進行訪問。如圖:sql
服務對象經過接口來訪問DAO,它使得服務對象易於測試,由於他們再也不與特定的數據訪問實現綁定在一塊兒。此外,數據訪問層是以持久化技術無關的方式來進行訪問的。持久化方式的選擇獨立於DAO,只有相關的數據訪問方法經過接口來進行發佈。這能夠實現靈活的設計並使得切換持久化框架對應用程序其餘部分所帶來的影響最小。若是將數據訪問層的實現細節滲透到應用程序的其餘部分中,那麼整個應用程序將與數據訪問層耦合在一塊兒,從而致使僵化的設計。數據庫
三、spring的數據訪問異常體系編程
JDBC訪問數據會強制捕獲SQLException異常,JDBC對於全部的數據訪問問題都會拋出SQLException異常,可是這個異常卻沒有告訴你哪裏出錯了以及如何進行處理,不能再catch塊中解決問題。一些持久化框架提供了相對豐富的異常體系。分別對應於特定的數據訪問問題。這樣就能夠針對想處理的異常編寫catch代碼塊。服務器
不一樣於JDBC,spring提供了多個數據訪問異常,分別描述了它們拋出時所對應的問題。如圖:框架
儘管spring的異常體系比JDBC簡單的SQLException豐富得多,但它並無與特定的持久化方式相關聯。這意味着咱們能夠用spring拋出一致的異常,而不用關心所選擇的持久化方案。這有助於咱們將全部持久化機制與數據訪問隔離開來。spring認爲觸發異常的不少問題是不能在catch代碼塊中修復的。spring使用了非檢查型異常,而不是強制開發人員編寫catch代碼塊。這把是否要捕獲異常的權力留給了開發人員。性能
四、數據訪問模板化測試
spring將數據訪問過程當中固定的和可變的部分明確劃分爲兩個不一樣的類:模板(template)和回調(callback)。模板管理過程當中固定的部分,而回調處理自定義的數據訪問代碼。如圖:this
針對不一樣的持久化平臺,spring提供了多個可選的模板。如圖:
使用數據訪問模板只需將其配置爲spring上下文中的bean並將織入到應用程序的DAO中。或者,你還可使用spring的DAO支持類進一步簡化應用程序的DAO配置。儘管直接織入模板是不錯的選擇,可是spring還提供了一系列便利的DAO基類,這些基類能夠用於管理模板。
五、使用DAO支持類
數據訪問模板並非spring數據訪問框架的所有。每一個模板提供了一些簡便的方法,使咱們沒必要建立明確的回調實現,從而簡化了數據訪問。另外,基於模板-回調設計,spring提供了DAO支持類,而將業務本身的DAO類做爲它的子類。如圖:
spring不只提供了多個數據模板實現類,還爲每種模板提供了對應的DAO支持類。如圖:
六、配置數據源
無論選擇哪種spring DAO的支持方式,都須要配置一個數據源的引用。spring提供了在spring上下文中配置數據源bean的多種方式,包括:
1)經過JNDI查找的數據源;
Spring應用程序常常部署在JavaEE應用服務器中,如WebSphere、JBoss或者像Tomcat這樣的Web容器。這些服務器容許你配置經過JNDI獲取數據源。這種配置的好處在於數據源徹底能夠在應用程序以外進行管理,這樣應用程序只需在訪問數據庫的時候查找數據源徹底能夠在應用程序以外進行管理,這樣應用程序只需在訪問數據庫的時候查找數據源就能夠了。另外,在應用服務器中管理的數據源經過以池的方式組織,從而具有更好的性能,而且支持系統管理員對其進行熱切換。
利用spring,咱們能夠像使用Spring Bean那樣配置JNDI中數據源的引用並將其裝配到須要的類中。位於jee命名空間下的<jee:jndi-lookup>元素並將其裝配到Spring中。如:<jee:jndi-lookup id="dataSource" jndi-name="/jdbc/zhyypt" resource-ref="true" />
2)鏈接池的數據源;
儘管Spring並無提供數據源鏈接池實現,但Jakarta Commons Data-base Connection Pooling(DBCP)項目是一個不錯的選擇。
DBCP包含了多個提供鏈接池功能的數據源,其中BasicDataSource是最經常使用的,由於它易於在Spring中配置,並且相似於Spring自帶的DriverManagerData-Source。配置以下:
3)經過JDBC驅動程序定義的數據源;
在Spring中,經過JDBC驅動定義數據源是最簡單的配置方式。Spring提供了兩種數據源對象供選擇。
DriverManagerDataSource:在每一個鏈接請求時都會返回一個新建的鏈接。與DBCP的BasicDataSource不一樣,由DriverManagerDataSource提供的鏈接並無進行池化管理。
SingleConnectionDataSource:在每一個鏈接請求時都會返回同一個鏈接。儘管SingleConnectionDataSource不是嚴格意義上的鏈接池數據源,可是你能夠將其視爲只有一個鏈接的池。
以上兩個鏈接的配置以下:
七、使用JDBC模板
Spring的JDBC框架承擔了資源管理和異常處理的工做,從而簡化了JDBC代碼。Spring爲JDBC提供了3個模板類使用。
JdbcTemplate:最基本的Spring JDBC模板,這個模板支持最簡單的JDBC數據庫訪問功能以及簡單的索引參數查詢。
NamedParameterJdbcTemplate:使用該模板執行查詢時,能夠將查詢值以命名參數的形式綁定到SQL中,而不是使用簡單的索引參數。
SimpleJdbcTemplate:該模板類利用Java5的一些特性,如自動裝箱、泛型以及可變參數列表來簡化JDBC模板的使用。
在Spring3.0中,對NamedParameterJdbcTemplate已經不在支持——因此相對於SimpleJdbcTemplate,沒有理由在選擇簡單的JdbcTemplate了。只須要設置DataSource就可以讓SimpleJdbcTemplate正常工做。在Spring中配置SimpleJdbcTemplate很是容易,以下所示:
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.simple.SimpleJdbcTemplate">
<constructor-arg ref="dataSource"/>
</bean>
屬性dataSource所引用的dataSource能夠是javax.sql.DataSource的任意實現。
如今,能夠將jdbcTemplate裝配到DAO中並使用它來訪問數據庫。
public class JdbcSpitterDAO impliments SpitterDAO{
private SimpleJdbcTemplate jdbcTemplate;
public void setJdbcTemplate(SimepleJdbcTemplate jdbcTemplate){
this.jdbcTemplate = jdbcTemplate;
}
}
還須要裝配JdbcSpitterDAO的jdbcTemplate屬性,以下:
<bean id="spitterDao" class="com.zhyypt.spitter.SimpleJdbcTemplateSpitterDao">
<property name="jdbcTemplate" ref="jdbcTemplate"/>
</bean>
對於應用程序中的每個JDBC DAO類,咱們都須要添加一個SimpleJdbcTemplate屬性以及對應的setter方法,並確保將SimpleJdbcTemplate Bean裝配到每一個DAO的SimpleJdbcTemplate屬性中。這會產生大量的重複工做。
一種可行的解決方案就是爲全部的DAO建立一個通用的父類,在其中會有SimpleJdbcTemplate屬性。而後讓全部的DAO類繼承這個類並使用父類的SimpleJdbcTemplate進行數據訪問。Spring提供了內置的基類(JdbcDaoSupport、SimpleJdbcDaoSupport和NamedParameterJdbcDaoSupport),分別對應於不一樣的Spring JDBC模板。要使用這些DAO支持類,就要確保DAO類繼承此類。如:
public class JdbcSpitterDao extends SimpleJdbcDaoSuppoort implements SpitterDao{
...
}