spring数据持久化
1、spring提供了一組數(shù)據(jù)訪問框架,集成了多種數(shù)據(jù)訪問技術(shù)。支持JDBC、ibatis、hibernate、jpa等持久化框架。
2、spring的數(shù)據(jù)訪問哲學(xué)
spring的目標(biāo)之一就是允許開發(fā)人員在開發(fā)應(yīng)用程序時,能夠遵循面向?qū)ο笤瓌t中的“針對接口編程”。spring對數(shù)據(jù)訪問的支持也不例外。DAO是數(shù)據(jù)訪問對象(data access object)的縮寫,DAO提供了數(shù)據(jù)讀取和寫入到數(shù)據(jù)庫中的一種方式。他們以接口的方式發(fā)布功能,應(yīng)用程序的其他部分可以通過接口來進(jìn)行訪問。如圖:
服務(wù)對象通過接口來訪問DAO,它使得服務(wù)對象易于測試,因為他們不再與特定的數(shù)據(jù)訪問實現(xiàn)綁定在一起。此外,數(shù)據(jù)訪問層是以持久化技術(shù)無關(guān)的方式來進(jìn)行訪問的。持久化方式的選擇獨立于DAO,只有相關(guān)的數(shù)據(jù)訪問方法通過接口來進(jìn)行發(fā)布。這可以實現(xiàn)靈活的設(shè)計并使得切換持久化框架對應(yīng)用程序其他部分所帶來的影響最小。如果將數(shù)據(jù)訪問層的實現(xiàn)細(xì)節(jié)滲透到應(yīng)用程序的其他部分中,那么整個應(yīng)用程序?qū)⑴c數(shù)據(jù)訪問層耦合在一起,從而導(dǎo)致僵化的設(shè)計。
3、spring的數(shù)據(jù)訪問異常體系
JDBC訪問數(shù)據(jù)會強制捕獲SQLException異常,JDBC對于所有的數(shù)據(jù)訪問問題都會拋出SQLException異常,但是這個異常卻沒有告訴你哪里出錯了以及如何進(jìn)行處理,不能再catch塊中解決問題。一些持久化框架提供了相對豐富的異常體系。分別對應(yīng)于特定的數(shù)據(jù)訪問問題。這樣就可以針對想處理的異常編寫catch代碼塊。
不同于JDBC,spring提供了多個數(shù)據(jù)訪問異常,分別描述了它們拋出時所對應(yīng)的問題。如圖:
盡管spring的異常體系比JDBC簡單的SQLException豐富得多,但它并沒有與特定的持久化方式相關(guān)聯(lián)。這意味著我們可以用spring拋出一致的異常,而不用關(guān)心所選擇的持久化方案。這有助于我們將所有持久化機制與數(shù)據(jù)訪問隔離開來。spring認(rèn)為觸發(fā)異常的很多問題是不能在catch代碼塊中修復(fù)的。spring使用了非檢查型異常,而不是強制開發(fā)人員編寫catch代碼塊。這把是否要捕獲異常的權(quán)力留給了開發(fā)人員。
4、數(shù)據(jù)訪問模板化
spring將數(shù)據(jù)訪問過程中固定的和可變的部分明確劃分為兩個不同的類:模板(template)和回調(diào)(callback)。模板管理過程中固定的部分,而回調(diào)處理自定義的數(shù)據(jù)訪問代碼。如圖:
針對不同的持久化平臺,spring提供了多個可選的模板。如圖:
使用數(shù)據(jù)訪問模板只需將其配置為spring上下文中的bean并將織入到應(yīng)用程序的DAO中。或者,你還可以使用spring的DAO支持類進(jìn)一步簡化應(yīng)用程序的DAO配置。盡管直接織入模板是不錯的選擇,但是spring還提供了一系列便利的DAO基類,這些基類可以用于管理模板。
5、使用DAO支持類
數(shù)據(jù)訪問模板并不是spring數(shù)據(jù)訪問框架的全部。每個模板提供了一些簡便的方法,使我們不必創(chuàng)建明確的回調(diào)實現(xiàn),從而簡化了數(shù)據(jù)訪問。另外,基于模板-回調(diào)設(shè)計,spring提供了DAO支持類,而將業(yè)務(wù)自己的DAO類作為它的子類。如圖:
spring不僅提供了多個數(shù)據(jù)模板實現(xiàn)類,還為每種模板提供了對應(yīng)的DAO支持類。如圖:
6、配置數(shù)據(jù)源
不管選擇哪一種spring DAO的支持方式,都需要配置一個數(shù)據(jù)源的引用。spring提供了在spring上下文中配置數(shù)據(jù)源bean的多種方式,包括:
1)通過JNDI查找的數(shù)據(jù)源;
Spring應(yīng)用程序經(jīng)常部署在JavaEE應(yīng)用服務(wù)器中,如WebSphere、JBoss或者像Tomcat這樣的Web容器。這些服務(wù)器允許你配置通過JNDI獲取數(shù)據(jù)源。這種配置的好處在于數(shù)據(jù)源完全可以在應(yīng)用程序之外進(jìn)行管理,這樣應(yīng)用程序只需在訪問數(shù)據(jù)庫的時候查找數(shù)據(jù)源完全可以在應(yīng)用程序之外進(jìn)行管理,這樣應(yīng)用程序只需在訪問數(shù)據(jù)庫的時候查找數(shù)據(jù)源就可以了。另外,在應(yīng)用服務(wù)器中管理的數(shù)據(jù)源通過以池的方式組織,從而具備更好的性能,并且支持系統(tǒng)管理員對其進(jìn)行熱切換。
利用spring,我們可以像使用Spring Bean那樣配置JNDI中數(shù)據(jù)源的引用并將其裝配到需要的類中。位于jee命名空間下的<jee:jndi-lookup>元素并將其裝配到Spring中。如:<jee:jndi-lookup id="dataSource" jndi-name="/jdbc/zhyypt" resource-ref="true" />
2)連接池的數(shù)據(jù)源;
盡管Spring并沒有提供數(shù)據(jù)源連接池實現(xiàn),但Jakarta Commons Data-base Connection Pooling(DBCP)項目是一個不錯的選擇。
DBCP包含了多個提供連接池功能的數(shù)據(jù)源,其中BasicDataSource是最常用的,因為它易于在Spring中配置,而且類似于Spring自帶的DriverManagerData-Source。配置如下:
3)通過JDBC驅(qū)動程序定義的數(shù)據(jù)源;
在Spring中,通過JDBC驅(qū)動定義數(shù)據(jù)源是最簡單的配置方式。Spring提供了兩種數(shù)據(jù)源對象供選擇。
DriverManagerDataSource:在每個連接請求時都會返回一個新建的連接。與DBCP的BasicDataSource不同,由DriverManagerDataSource提供的連接并沒有進(jìn)行池化管理。
SingleConnectionDataSource:在每個連接請求時都會返回同一個連接。盡管SingleConnectionDataSource不是嚴(yán)格意義上的連接池數(shù)據(jù)源,但是你可以將其視為只有一個連接的池。
以上兩個連接的配置如下:
7、使用JDBC模板
Spring的JDBC框架承擔(dān)了資源管理和異常處理的工作,從而簡化了JDBC代碼。Spring為JDBC提供了3個模板類使用。
JdbcTemplate:最基本的Spring JDBC模板,這個模板支持最簡單的JDBC數(shù)據(jù)庫訪問功能以及簡單的索引參數(shù)查詢。
NamedParameterJdbcTemplate:使用該模板執(zhí)行查詢時,可以將查詢值以命名參數(shù)的形式綁定到SQL中,而不是使用簡單的索引參數(shù)。
SimpleJdbcTemplate:該模板類利用Java5的一些特性,如自動裝箱、泛型以及可變參數(shù)列表來簡化JDBC模板的使用。
在Spring3.0中,對NamedParameterJdbcTemplate已經(jīng)不在支持——所以相對于SimpleJdbcTemplate,沒有理由在選擇簡單的JdbcTemplate了。只需要設(shè)置DataSource就能夠讓SimpleJdbcTemplate正常工作。在Spring中配置SimpleJdbcTemplate非常容易,如下所示:
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.simple.SimpleJdbcTemplate">
<constructor-arg ref="dataSource"/>
</bean>
屬性dataSource所引用的dataSource可以是javax.sql.DataSource的任意實現(xiàn)。
現(xiàn)在,可以將jdbcTemplate裝配到DAO中并使用它來訪問數(shù)據(jù)庫。
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>
對于應(yīng)用程序中的每一個JDBC DAO類,我們都需要添加一個SimpleJdbcTemplate屬性以及對應(yīng)的setter方法,并確保將SimpleJdbcTemplate ?Bean裝配到每個DAO的SimpleJdbcTemplate屬性中。這會產(chǎn)生大量的重復(fù)工作。
一種可行的解決方案就是為所有的DAO創(chuàng)建一個通用的父類,在其中會有SimpleJdbcTemplate屬性。然后讓所有的DAO類繼承這個類并使用父類的SimpleJdbcTemplate進(jìn)行數(shù)據(jù)訪問。Spring提供了內(nèi)置的基類(JdbcDaoSupport、SimpleJdbcDaoSupport和NamedParameterJdbcDaoSupport),分別對應(yīng)于不同的Spring JDBC模板。要使用這些DAO支持類,就要確保DAO類繼承此類。如:
public class JdbcSpitterDao extends SimpleJdbcDaoSuppoort implements SpitterDao{
...
}
轉(zhuǎn)載于:https://www.cnblogs.com/jizhuan/p/6565811.html
新人創(chuàng)作打卡挑戰(zhàn)賽發(fā)博客就能抽獎!定制產(chǎn)品紅包拿不停!總結(jié)
以上是生活随笔為你收集整理的spring数据持久化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: bzoj1339[Baltic2008]
- 下一篇: java中的基本数据类型的取值范围分别是