spring数据持久化
1、spring提供了一組數據訪問框架,集成了多種數據訪問技術。支持JDBC、ibatis、hibernate、jpa等持久化框架。
2、spring的數據訪問哲學
spring的目標之一就是允許開發人員在開發應用程序時,能夠遵循面向對象原則中的“針對接口編程”。spring對數據訪問的支持也不例外。DAO是數據訪問對象(data access object)的縮寫,DAO提供了數據讀取和寫入到數據庫中的一種方式。他們以接口的方式發布功能,應用程序的其他部分可以通過接口來進行訪問。如圖:
服務對象通過接口來訪問DAO,它使得服務對象易于測試,因為他們不再與特定的數據訪問實現綁定在一起。此外,數據訪問層是以持久化技術無關的方式來進行訪問的。持久化方式的選擇獨立于DAO,只有相關的數據訪問方法通過接口來進行發布。這可以實現靈活的設計并使得切換持久化框架對應用程序其他部分所帶來的影響最小。如果將數據訪問層的實現細節滲透到應用程序的其他部分中,那么整個應用程序將與數據訪問層耦合在一起,從而導致僵化的設計。
3、spring的數據訪問異常體系
JDBC訪問數據會強制捕獲SQLException異常,JDBC對于所有的數據訪問問題都會拋出SQLException異常,但是這個異常卻沒有告訴你哪里出錯了以及如何進行處理,不能再catch塊中解決問題。一些持久化框架提供了相對豐富的異常體系。分別對應于特定的數據訪問問題。這樣就可以針對想處理的異常編寫catch代碼塊。
不同于JDBC,spring提供了多個數據訪問異常,分別描述了它們拋出時所對應的問題。如圖:
盡管spring的異常體系比JDBC簡單的SQLException豐富得多,但它并沒有與特定的持久化方式相關聯。這意味著我們可以用spring拋出一致的異常,而不用關心所選擇的持久化方案。這有助于我們將所有持久化機制與數據訪問隔離開來。spring認為觸發異常的很多問題是不能在catch代碼塊中修復的。spring使用了非檢查型異常,而不是強制開發人員編寫catch代碼塊。這把是否要捕獲異常的權力留給了開發人員。
4、數據訪問模板化
spring將數據訪問過程中固定的和可變的部分明確劃分為兩個不同的類:模板(template)和回調(callback)。模板管理過程中固定的部分,而回調處理自定義的數據訪問代碼。如圖:
針對不同的持久化平臺,spring提供了多個可選的模板。如圖:
使用數據訪問模板只需將其配置為spring上下文中的bean并將織入到應用程序的DAO中。或者,你還可以使用spring的DAO支持類進一步簡化應用程序的DAO配置。盡管直接織入模板是不錯的選擇,但是spring還提供了一系列便利的DAO基類,這些基類可以用于管理模板。
5、使用DAO支持類
數據訪問模板并不是spring數據訪問框架的全部。每個模板提供了一些簡便的方法,使我們不必創建明確的回調實現,從而簡化了數據訪問。另外,基于模板-回調設計,spring提供了DAO支持類,而將業務自己的DAO類作為它的子類。如圖:
spring不僅提供了多個數據模板實現類,還為每種模板提供了對應的DAO支持類。如圖:
6、配置數據源
不管選擇哪一種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不是嚴格意義上的連接池數據源,但是你可以將其視為只有一個連接的池。
以上兩個連接的配置如下:
7、使用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{
...
}
轉載于:https://www.cnblogs.com/jizhuan/p/6565811.html
新人創作打卡挑戰賽發博客就能抽獎!定制產品紅包拿不停!總結
以上是生活随笔為你收集整理的spring数据持久化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: bzoj1339[Baltic2008]
- 下一篇: java中的基本数据类型的取值范围分别是