久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Spring DAO層的設(shè)計(jì)思想

 南郡修道院 2012-10-14

Spring DAO層的設(shè)計(jì)思想  

2011-03-17 11:12:06|  分類: 默認(rèn)分類 |字號(hào) 訂閱

概述 
    近幾年持久化技術(shù)領(lǐng)域異常喧囂,各種框架雨后春筍般地冒出,,Sun也連接不斷地頒布幾個(gè)持久化規(guī)范,。Spring對(duì)多個(gè)持久化技術(shù)提供了集成的支持,,包括Hibernate、iBatis,、JDO,、JPA、TopLink,,此外,,還通過Spring JDBC框架對(duì)JDBC API進(jìn)行簡(jiǎn)化。Spring面向DAO制定了一個(gè)通用的異常體系,,屏蔽具體持久化技術(shù)的異常,,使業(yè)務(wù)層和具體的持久化技術(shù)達(dá)到解耦。此外,,Spring提供了模板類簡(jiǎn)化各種持久化技術(shù)的使用,。通用的異常體系及模板類是Spring整合各種五花八門持久化技術(shù)的不二法門,Spring不但借此實(shí)現(xiàn)了對(duì)多種持久化技術(shù)的整合,,還可以不費(fèi)吹灰之力整合潛在的各種持久化框架,,體現(xiàn)了“開-閉原則”的經(jīng)典應(yīng)用,。
    Spring的DAO理念
    DAO(Data Access Object)是用于訪問數(shù)據(jù)的對(duì)象,,雖然我們?cè)诖蠖鄶?shù)情況下,將數(shù)據(jù)保存在數(shù)據(jù)庫(kù)中,,但這并不是唯一的選擇,,你也可以將數(shù)據(jù)存儲(chǔ)到文件中或LDAP中。DAO不但屏蔽了數(shù)據(jù)存儲(chǔ)的最終介質(zhì)的不同,,也屏蔽了具體的實(shí)現(xiàn)技術(shù)的不同,。
早期,JDBC是訪問數(shù)據(jù)庫(kù)的主流選擇,,近幾年,,數(shù)據(jù)持久技術(shù)獲得了長(zhǎng)足的發(fā)展,Hibernate,、iBatis,、JPA、JDO成為持久層中爭(zhēng)放異彩的實(shí)現(xiàn)技術(shù),。只要為數(shù)據(jù)訪問定義好DAO接口,,并使用具體的技術(shù)實(shí)現(xiàn)DAO接口的功能,你就可以在不同的實(shí)現(xiàn)技術(shù)間平滑的切換,。


圖 1 業(yè)務(wù)層通過DAO接口訪問數(shù)據(jù)

    圖 1是一個(gè)典型的DAO應(yīng)用實(shí)例,,在UserDao中定義訪問User數(shù)據(jù)對(duì)象的接口方法,業(yè)務(wù)層通過UserDao操作數(shù)據(jù),,并使用具體持久技術(shù)實(shí)現(xiàn)UserDao接口方法,,這樣業(yè)務(wù)層和具體持久化技術(shù)就實(shí)現(xiàn)了解耦,。
    提供DAO層的抽象可以帶來一些好處,首先,,我們可以很容易地構(gòu)造模擬對(duì)象,,方便單元測(cè)試的開展,其次在使用切面時(shí),,我們有更多的選擇:既可以使用JDK動(dòng)態(tài)代理也可以使用CGLib動(dòng)態(tài)代理,。
    Spring本質(zhì)上希望以統(tǒng)一的方式整合底層的持久化技術(shù):以統(tǒng)一的方式進(jìn)行調(diào)用及事務(wù)管理,避免讓具體的實(shí)現(xiàn)侵入到業(yè)務(wù)層的代碼中,。由于每個(gè)持久化實(shí)現(xiàn)技術(shù)都有各自的異常體系,,所以Spring提供了統(tǒng)一的異常體系,使不同異常體系的阻抗得以彌消,,方便定義出和具體實(shí)現(xiàn)技術(shù)無(wú)關(guān)的DAO接口,,以及整合到相同的事務(wù)管理體系中。   

  統(tǒng)一的異常體系
    統(tǒng)一的異常體系是整合不同的持久化實(shí)現(xiàn)技術(shù)的關(guān)鍵,,Spring提供了一套和實(shí)現(xiàn)技術(shù)無(wú)關(guān)的,、面向于DAO層次語(yǔ)義的異常體系,并通過轉(zhuǎn)換器將不同的持久化技術(shù)異常轉(zhuǎn)換成Spring的異常,。     Spring DAO異常體系類非常豐富,,這里,我們僅列出DataAccessException異常類下的子類,。我們可以很容易地通過異常類的名字了解到異常所代表的語(yǔ)義,。我們通過下表對(duì)這些異常進(jìn)行簡(jiǎn)單的描述:

表 1 Spring DAO異常體系類

異常

 

 

 

說明

 

 

 

CleanupFailureDataAccessException

 

 

 

 DAO操作成功執(zhí)行,但在釋放數(shù)據(jù)資源時(shí)發(fā)生異常,,如關(guān)閉Connection時(shí)發(fā)生異常等,。

 

 

 

ConcurrencyFailureException

 

 

 

表示在進(jìn)行并發(fā)數(shù)據(jù)操作時(shí)發(fā)生異常,如樂觀鎖無(wú)法獲取,、悲觀鎖無(wú)法獲取,、死鎖引發(fā)的失敗等待異常。

 

 

 

DataAccessResourceFailureException

 

 

 

訪問數(shù)據(jù)資源時(shí)失敗,,如無(wú)法獲取數(shù)據(jù)連接,,無(wú)法獲取Hibernate的會(huì)話等。

 

 

 

DataRetrievalFailureException

 

 

 

獲取數(shù)據(jù)失敗,,如找不到對(duì)應(yīng)主鍵的數(shù)據(jù),,使用了錯(cuò)誤的列索引等。

 

 

 

DataSourceLookupFailureException

 

 

 

無(wú)法從JNDI中查找到數(shù)據(jù)源,。這個(gè)異常是Spring 2.0新增的,。

 

 

 

DataIntegrityViolationException

 

 

 

當(dāng)數(shù)據(jù)操作違反了數(shù)據(jù)一致性限制時(shí)拋出的異常,如插入重復(fù)的主鍵,引用不存在的外鍵等,。

 

 

 

InvalidDataAccessApiUsageException

 

 

 

不正確地調(diào)用某一持久化技術(shù)時(shí)拋出的異常,,如在Spring JDBC中查詢對(duì)象在調(diào)用前必須進(jìn)行編譯操作,如果忘記這項(xiàng)操作將會(huì)產(chǎn)生該異常,。這種異常不是由底層數(shù)據(jù)資源產(chǎn)生,,而是由不正確地使用持久化技術(shù)產(chǎn)生的。

 

 

 

InvalidDataAccessResourceUsage
Exception

 

 

 

在訪問數(shù)據(jù)源時(shí)使用了不正確的方法所拋出的異常,,如SQL語(yǔ)句錯(cuò)誤將拋出該異常,。

 

 

 

PermissionDeniedDataAccessException

 

 

 

數(shù)據(jù)訪問時(shí)由于權(quán)限不足引發(fā)的異常。如用僅擁有只讀權(quán)限用戶試圖進(jìn)行數(shù)據(jù)更改操作將拋出該異常,。該異常是Spring 2.0新增的,。

 

 

 

UncategorizedDataAccessException

 

 

 

其它未分類的異常都?xì)w到該異常中。

 

 

 

    為了進(jìn)一步細(xì)化錯(cuò)誤的問題域,,Spring對(duì)一級(jí)異常類進(jìn)行子類的細(xì)分,,如InvalidDataAccessResourceUsageException就擁有10多個(gè)子類,下面是其中3個(gè)子類:


圖 3 一級(jí)異常類的細(xì)化

    對(duì)于InvalidDataAccessResourceUsageException異常,,不同的持久化實(shí)現(xiàn)技術(shù)均有對(duì)應(yīng)的子異常類,。如  BadSqlGrammarException對(duì)應(yīng)JDBC實(shí)現(xiàn)技術(shù)SQL語(yǔ)句語(yǔ)法錯(cuò)誤的異常,而HibernateQueryExcpetion和TopLinkQueryException分別對(duì)應(yīng)Hibernate和TopLink實(shí)現(xiàn)技術(shù)的查詢語(yǔ)法異常,。
    Spring的這個(gè)異常體系具有高度的可擴(kuò)展性,,當(dāng)Spring需要對(duì)一個(gè)新的持久化技術(shù)提供支持時(shí),只要定義為其定義一個(gè)對(duì)應(yīng)的子異常就可以了,,這種更改完全滿足設(shè)計(jì)模式中的開-閉原則,。
    雖然Spring定義了如此豐富的異常類,作為開發(fā)人員,,我們僅需要對(duì)感興趣的異常進(jìn)行處理就可以了。假設(shè)某一個(gè)項(xiàng)目要求在發(fā)生樂觀鎖異常時(shí),,嘗試再次獲取樂觀鎖非不是直接返回錯(cuò)誤,。那么,我們只需要在代碼中顯式捕捉ConcurrencyFailureException異常,,然后在catch代碼塊中編寫滿足需求的邏輯即可,。其它眾多的異常則可以簡(jiǎn)單地交由框架自動(dòng)處理(如發(fā)生運(yùn)行期異常時(shí)自動(dòng)回滾事務(wù))。
    Spring的DAO異常體系
    在很多正統(tǒng)API或框架中,,檢查型異常被過多的使用,,以至在使用API時(shí),代碼里充斥著大量的try/catch樣板式的代碼,。在很多情況下,,除了在try/catch中記錄異常信息以外,我們并沒有做多少實(shí)質(zhì)性的工作,。引發(fā)異常的問題往往是不可恢復(fù)的,,如數(shù)據(jù)連接失敗,,SQL語(yǔ)句存在語(yǔ)法錯(cuò)誤,強(qiáng)制捕捉的檢查型異常除了限制開發(fā)人員的自由度以外,,并沒有提供什么有意義的作用,。因此,Spring的異常體系都是建立在運(yùn)行期異常的基礎(chǔ)上,,開發(fā)者可以根據(jù)需要捕捉感興趣的異常,。
    JDK很多API之所以難用,一個(gè)很大的原因就是檢查型異常的泛濫,,如JavaMail,、EJB以及JDBC等等,使用這些API,,一堆堆異常處理的代碼喧賓奪主式地侵入業(yè)務(wù)代碼中,,破壞了代碼的整潔和優(yōu)雅。
    Spring在org.springframework.dao包中提供了一套完備優(yōu)雅的DAO異常體系,,這些異常都繼承于DataAccessException,,而DataAccessException本身又繼承于NestedRuntimeException,NestedRuntimeException異常以嵌套的方式封裝了源異常,。因?yàn)殡m然不同持久化技術(shù)的特定異常被轉(zhuǎn)換到Spring的DAO異常體系中,,原始的異常信息并不會(huì)丟失,只要你愿意,,就可以方便地通過getCause()方法獲取原始的異常信息,。
    Spring的DAO異常體系并不和具體的實(shí)現(xiàn)技術(shù)相關(guān),它從DAO概念的抽象層面定義了異常的目錄樹,。在所有的持久化框架中,,我們并沒有發(fā)現(xiàn)擁有如此豐富語(yǔ)義異常體系的框架,Spring這種設(shè)計(jì)無(wú)疑是獨(dú)具匠心的,,它使得開發(fā)人員關(guān)注某一特定語(yǔ)義的異常變得容易,。在JDBC中的SQLException中,你必須通過異常的getErrorCode()或getSQLState()獲取錯(cuò)誤代碼,,直接根據(jù)這些代碼判斷是錯(cuò)誤的類型,,這種過于底層的API不但帶來了代碼編寫上的難度,而且也使代碼的移植變得困難,,因?yàn)間etErrorCode()是數(shù)據(jù)庫(kù)相關(guān)的,。
    Spring以分類手法建立了異常分類目錄,對(duì)于大部分應(yīng)用來說,,這個(gè)異常分類目錄對(duì)異常類型的劃分具有適當(dāng)?shù)念w粒度,。一方面,使開發(fā)者從底層細(xì)如針麻的技術(shù)細(xì)節(jié)中脫身出來,另一方面,,可以從這個(gè)語(yǔ)義豐富的異常體系中選擇感興趣的異常加以處理,。圖 2列出了那些位于Spring DAO異常體系第一層次的異常類,每個(gè)異常類下還可能擁有眾多的子異常類:


圖 2 Spring DAO異常體系 
    JDBC的異常轉(zhuǎn)換器
    傳統(tǒng)的JDBC API在發(fā)生幾乎所有的數(shù)據(jù)操作問題都拋出相同的SQLException,,它將異常的細(xì)節(jié)性信息封裝在異常屬性中,,所以如果希望了解異常的具體原因,你必須分析異常對(duì)象的信息,。
    SQLException擁有兩個(gè)代表異常具體原因的屬性:錯(cuò)誤碼和SQL狀態(tài)碼,,前者是數(shù)據(jù)庫(kù)相關(guān)的,可通過getErrorCode()返回,,其值的類型是int,;而后者是一個(gè)標(biāo)準(zhǔn)的錯(cuò)誤代碼,可通過getSQLState()返回,,是一個(gè)String類型的值,,由5字符組成。
     Spring根據(jù)錯(cuò)誤碼和SQL狀態(tài)碼信息將SQLExeption翻譯成Spring DAO的異常體系,。在org.springframework.jdbc.support包中定義了SQLExceptionTranslator接口,,該接口的兩個(gè)實(shí)現(xiàn)類SQLErrorCodeSQLExceptionTranslator和SQLStateSQLExceptionTranslator分別負(fù)責(zé)處理SQLException中錯(cuò)誤代碼和SQL狀態(tài)碼的翻譯工作。將SQLException翻譯成Spring DAO異常體系的工作是比較艱辛的,,但Spring框架替我們完成這項(xiàng)艱巨的工作并保證轉(zhuǎn)換的正確性,,我們有充分的理由依賴這個(gè)轉(zhuǎn)換的正確性。
    其它持久技術(shù)的異常轉(zhuǎn)換器
    由于各種框架級(jí)的持久化技術(shù)都擁有一個(gè)語(yǔ)義明確的異常體系,,所以將這些異常轉(zhuǎn)換為Spring DAO的體系相對(duì)輕松一些,。下面,我們將對(duì)不同持久化技術(shù)的異常轉(zhuǎn)換器進(jìn)行學(xué)習(xí),。
    由于Hibernate 3.0版本和低版本不兼容,,Spring分別為這兩個(gè)版本分別提供了支持(這也可以看出Hibernate在Spring中所享受的特殊禮遇)。在org.springframework.orm包中,,分別為Spring所支持的ORM持久化技術(shù)定義了一個(gè)子包,,在這些子包中提供相應(yīng)ORM技術(shù)的整合類。Spring為各個(gè)ORM持久化技術(shù)所提供的異常轉(zhuǎn)換器在表 2中說明:

表 2 各ORM持久化技術(shù)異常轉(zhuǎn)換器

ORM持久化技術(shù)

 

 

異常轉(zhuǎn)換器

 

 

Hibernate

 

 

org.springframework.orm.hibernate.SessionFactoryUtils

 

 

Hibernate 3.0

 

 

org.springframework.orm.hibernate3.SessionFactoryUtils

 

 

JPA

 

 

org.springframework.orm.jpa.EntityManagerFactoryUtils

 

 

JDO

 

 

org.springframework.orm.jdo.PersistenceManagerFactoryUtils

 

 

TopLink

 

 

org.springframework.orm.toplink.SessionFactoryUtils

 

 


    ORM持久化技術(shù) 異常轉(zhuǎn)換器
    Hibernate org.springframework.orm.hibernate.SessionFactoryUtils
    Hibernate 3.0 org.springframework.orm.hibernate3.SessionFactoryUtils
    JPA org.springframework.orm.jpa.EntityManagerFactoryUtils
    JDO org.springframework.orm.jdo.PersistenceManagerFactoryUtils
    TopLink org.springframework.orm.toplink.SessionFactoryUtils
    這些工具類除了具有異常轉(zhuǎn)換的功能外,,在進(jìn)行事務(wù)管理時(shí),還提供了從事務(wù)上下文中返回相同會(huì)話的功能,。
Spring也支持iBatis ORM持久化技術(shù),,由于iBatis拋出的異常是和JDBC相同的SQLException異常,所以直接采用和JDBC相同的異常轉(zhuǎn)換器,。 
    統(tǒng)一數(shù)據(jù)訪問模板
    到一個(gè)餐館用餐,,大抵都會(huì)經(jīng)歷這個(gè)的一個(gè)流程,進(jìn)入餐館->迎賓小姐問候并引到適合的位置->抄起菜單點(diǎn)菜>用餐->買單->離開餐館。之所以我們喜歡時(shí)不時(shí)下下館子,,就是因?yàn)槲覀冎灰c(diǎn)菜->用餐->買單就可以了,,幕后的烹飪制作、刷鍋洗盤等工作我們完全不用關(guān)心,,一切已經(jīng)由餐館服務(wù)人員按照服務(wù)流程按部就班,,有條不紊地執(zhí)行了。衡量一個(gè)餐館服務(wù)質(zhì)量好壞的一個(gè)重要標(biāo)準(zhǔn)是我們無(wú)須關(guān)心他們所負(fù)責(zé)流程:不用催問菜為什么還沒有上好(不但快而且服務(wù)態(tài)度佳),,不用關(guān)心盤子為什么不干凈(不但干凈而且已經(jīng)進(jìn)行了消毒),。
    從某種角度看,與其說餐館為我們提供了服務(wù),,還不如說我們參與到餐館的流程中:不管什么顧客點(diǎn)的菜都由相同的櫥師烹制,,不管什么顧客都按單付錢。在幕后,,餐館擁有一個(gè)服務(wù)的模板,,模板中定義的流程可以用于應(yīng)付所有的顧客,只要為顧客提供幾個(gè)專有需求(點(diǎn)的菜也可不一樣,,座位可以自由選擇),,其它一切都按模板化的方式處理。
    在直接使用具體的持久化技術(shù)時(shí),,我們大多需要處理整個(gè)流程,,并沒有享受餐館用餐式的便捷。Spring為支持的持久化技術(shù)分別提供了模板訪問的方式,,降低了使用各種持久化技術(shù)的難度,,可以大幅提高開發(fā)效率。
使用模板和回調(diào)機(jī)制
    下面是一段使用JDBC進(jìn)行數(shù)據(jù)訪問操作的簡(jiǎn)單代碼,,我們已經(jīng)盡可能簡(jiǎn)化整個(gè)過程的處理了,,但以下的步驟幾乎都是不可或缺的。
    代碼清單 1 JDBC數(shù)據(jù)訪問



public void saveCustomer(Customer customer) throws Exception ...{ Connection con=null; PreparedStatement stmt=null; try ...{ con=getConnection();① 獲取資源 con.setAutoCommit(false); ② 啟動(dòng)事務(wù) ③ 具體數(shù)據(jù)訪問操作和處理 stmt=con.prepareStatement("insert into CUSTOMERS(ID,NAME) values(?,?)"); stmt.setLong(1,customerId); stmt.setString(2,customer.getName()); stmt.execute(); stmt.execute(); con.commit();④提交事務(wù) }catch(Exception e)...{ ③ ⑤ 回滾事務(wù) try...{ con.rollback(); }catch(SQLException sqlex)...{ sqlex.printStackTrace(System.out); } throw e; }finally...{ ⑥ 釋放資源 try...{ stmt.close(); con.close(); }catch(Exception e)...{ e.printStackTrace(); } } }

    如以上數(shù)據(jù)訪問代碼所示,,JDBC數(shù)據(jù)訪問操作按以下的流程進(jìn)行:
    1. 準(zhǔn)備資源,;
    2. 啟動(dòng)事務(wù);
    3. 在事務(wù)中執(zhí)行具體數(shù)據(jù)訪問操作,;
    4. 返回?cái)?shù)據(jù),;
    5. 提交/回滾事務(wù);
    6. 關(guān)閉資源,,處理異常,。
    按照傳統(tǒng)的方式,編寫任何帶事務(wù)的數(shù)據(jù)訪問的程序時(shí),,你都需要重復(fù)編寫上面的代碼,,而其中只有粗體部分所示的代碼是業(yè)務(wù)相關(guān)的,,而其它的代碼都是在做一些例行公事,因而導(dǎo)致了大量八股文式的代碼充斥著整個(gè)程序,。 
    Spring將這個(gè)相同的數(shù)據(jù)訪問流程固化到模板類中,,并將數(shù)據(jù)訪問中固定和變化的部分分開,同時(shí)保證模板類是線程安全,,以便多個(gè)數(shù)據(jù)訪問線程共享同一模板實(shí)例,。固定的部分在模板類中已經(jīng)準(zhǔn)備好,而變化的部分通過回調(diào)接口開放出來,,用于定義具 體數(shù)據(jù)訪問和結(jié)果返回的操作,。圖 4描述了模板類是如何拆分固定和變化部分的邏輯:


圖 4 Spring DAO模板和回調(diào)

    這樣,我們只要編寫好回調(diào)接口,,并調(diào)用模板類進(jìn)行數(shù)據(jù)訪問,,就可以得到預(yù)想的結(jié)果:數(shù)據(jù)訪問成功執(zhí)行,前置和后置的樣板化工作也得到順序的執(zhí)行,,在提高開發(fā)效率的同時(shí)保證了資源使用的正確性,,徹底消除因忽視資源釋放而引起的資源泄漏的問題。 
    Spring為不同持久化技術(shù)所提供的模板類
    Spring為各種支持的持久化技術(shù)都提供了簡(jiǎn)化操作的模板和回調(diào),,在回調(diào)中編寫具體的數(shù)據(jù)操作邏輯,,使用模板執(zhí)行數(shù)據(jù)操    作,在Spring中,,這是典型的數(shù)據(jù)操作模式,。下面,我們來了解一下Spring為不同的持久化技術(shù)所提供的模板類,。
    表 3 不同持久化技術(shù)對(duì)應(yīng)的模板類
    ORM持久化技術(shù) 模板類
    JDBC org.springframework.jdbc.core. JdbcTemplate 
    Hibernate org.springframework.orm.hibernate.HibernateTemplate
    Hibernate 3.0 org.springframework.orm.hibernate3.HibernateTemplate
    iBatis org.springframework.orm.ibatis.SqlMapClientTemplate
   JPA org.springframework.orm.jpa.JpaTemplate
    JDO org.springframework.orm.jdo.JdoTemplate
    TopLink org.springframework.orm.jpa. JpaTemplate
    如果你使用JDK 5.0或以上版本,,則可以使用jdbc.core.simple.SimpleJdbcTemplate的模板類,該模板類使用了泛型和不定入數(shù)的技術(shù),,使模板的功能更加強(qiáng)大,,更易于使用。
    如果,,我們直接使用模板類,,一般都需要在DAO中定義一個(gè)模板對(duì)象并提供數(shù)據(jù)資源,Spring為每一個(gè)持久化技術(shù)都提供了支持類,,支持類中已經(jīng)為我們完成這樣的功能,。這樣,我們只需要擴(kuò)展這些支持類就可以直接編寫實(shí)際的數(shù)據(jù)訪問邏輯,,沒有須臾的阻隔,。
    不同持久化技術(shù)的支持類如表 4所示: 

ORM持久化技術(shù)

 

支持類

 

JDBC

 

org.springframework.jdbc.core. JdbcDaoSupport

 

Hibernate

 

org.springframework.orm.hibernate.HibernateDaoSupport

 

Hibernate 3.0

 

org.springframework.orm.hibernate3.HibernateDaoSupport

 

iBatis

 

org.springframework.orm.ibatis.SqlMapClientDaoSupport

 

JPA

 

org.springframework.orm.jpa.JpaDaoSupport

 

JDO

 

org.springframework.orm.jdo.JdoDaoSupport

 

TopLink

 

org.springframework.orm.jpa. JpaDaoSupport

 

表 4 持久化技術(shù)的支持類 

     ORM持久化技術(shù) 支持類
    JDBC org.springframework.jdbc.core. JdbcDaoSupport
    Hibernate org.springframework.orm.hibernate.HibernateDaoSupport
    Hibernate 3.0 org.springframework.orm.hibernate3.HibernateDaoSupport
    iBatis org.springframework.orm.ibatis.SqlMapClientDaoSupport
    JPA org.springframework.orm.jpa.JpaDaoSupport
    JDO org.springframework.orm.jdo.JdoDaoSupport
    TopLink org.springframework.orm.jpa. JpaDaoSupport
    這些支持類都繼承于dao.support.DaoSupport類,DaoSupport實(shí)現(xiàn)了InitializingBean接口,,在afterPropertiesSet()接口方法中檢查模板對(duì)象和數(shù)據(jù)源是否被正確設(shè)置,,否則將拋出異常。
所有的支持類都是abstract的,,其目的是希望被繼承使用,,而非直接使用。
    小結(jié)
    Spring 支持目前大多數(shù)常用的數(shù)據(jù)持久化技術(shù),,Spring定義了一套面向DAO層的異常體系,,并為各種支持的持久化技術(shù)提供了異常轉(zhuǎn)換器。這樣,,我們?cè)谠O(shè)計(jì)DAO接口時(shí),,就可以拋開具體的實(shí)現(xiàn)技術(shù),定義統(tǒng)一的接口,。
不管采用何種持久化技術(shù),,訪問數(shù)據(jù)的流程是相對(duì)固定的。Spring將數(shù)據(jù)訪問流程劃分為固定和變化兩部分,,并以模板的方式定義好流程,,用回調(diào)接口將變化的部分開放出來,留給開發(fā)者自行定義,。這樣,,我們僅需要提供業(yè)務(wù)相關(guān)的邏輯就可以完成整體的數(shù)據(jù)訪問了。Spring為了進(jìn)一步簡(jiǎn)化持久化模板類的調(diào)整,,為各種持久化技術(shù)提供了使用模板的支持類,,支持類不但包含數(shù)據(jù)訪問模板,還包含數(shù)據(jù)源或會(huì)話,。通過擴(kuò)展支持類定義自己的數(shù)據(jù)訪問類是最簡(jiǎn)單的數(shù)據(jù)訪問方式,。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多