Spring DAO層設計思想(轉載)

轉載:原文網址 http://robinsoncrusoe.iteye.com/blog/805731spring

 

概述
      【IT168 專稿】近幾年持久化技術領域異常喧囂,各類框架雨後春筍般地冒出,Sun也鏈接不斷地頒佈幾個持久化規範。Spring對多個持久化技術提供了集成的支持,包括 Hibernate、iBatis、JDO、JPA、TopLink,此外,還經過Spring JDBC框架對JDBC API進行簡化。Spring面向DAO制定了一個通用的異常體系,屏蔽具體持久化技術的異常,使業務層和具體的持久化技術達到解耦。此外,Spring 提供了模板類簡化各類持久化技術的使用。通用的異常體系及模板類是Spring整合各類五花八門持久化技術的不二法門,Spring不但藉此實現了對多種持久化技術的整合,還能夠不費吹灰之力整合潛在的各類持久化框架,體現了「開-閉原則」的經典應用。

    Spring的DAO理念
      DAO(Data Access Object)是用於訪問數據的對象,雖然咱們在大多數狀況下,將數據保存在數據庫中,但這並非惟一的選擇,你也能夠將數據存儲到文件中或LDAP中。 DAO不但屏蔽了數據存儲的最終介質的不一樣,也屏蔽了具體的實現技術的不一樣。
      早期,JDBC是訪問數據庫的主流選擇,近幾年,數據持久技術得到了長足的發展,Hibernate、iBatis、JPA、JDO成爲持久層中爭放異彩的實現技術。只要爲數據訪問定義好DAO接口,並使用具體的技術實現DAO接口的功能,你就能夠在不一樣的實現技術間平滑的切換。


圖 1 業務層經過DAO接口訪問數據
    圖 1是一個典型的DAO應用實例,在UserDao中定義訪問User數據對象的接口方法,業務層經過UserDao操做數據,並使用具體持久技術實現UserDao接口方法,這樣業務層和具體持久化技術就實現瞭解耦。
    提供DAO層的抽象能夠帶來一些好處,首先,咱們能夠很容易地構造模擬對象,方便單元測試的開展,其次在使用切面時,咱們有更多的選擇:既可使用JDK動態代理也可使用CGLib動態代理。
    Spring本質上但願以統一的方式整合底層的持久化技術:以統一的方式進行調用及事務管理,避免讓具體的實現侵入到業務層的代碼中。因爲每一個持久化實現 技術都有各自的異常體系,因此Spring提供了統一的異常體系,使不一樣異常體系的阻抗得以彌消,方便定義出和具體實現技術無關的DAO接口,以及整合到相同的事務管理體系中。





統一的異常體系
     統一的異常體系是整合不一樣的持久化實現技術的關鍵,Spring提供了一套和實現技術無關的、面向於DAO層次語義的異常體系,並經過轉換器將不一樣的持久化技術異常轉換成Spring的異常。

Spring的DAO異常體系
      在不少正統API或框架中,檢查型異常被過多的使用,以致在使用API時,代碼裏充斥着大量的try/catch樣板式的代碼。在不少狀況下,除了在 try/catch中記錄異常信息之外,咱們並無作多少實質性的工做。引起異常的問題每每是不可恢復的,如數據鏈接失敗,SQL語句存在語法錯誤,強制捕捉的檢查型異常除了限制開發人員的自由度之外,並無提供什麼有意義的做用。所以,Spring的異常體系都是創建在運行期異常的基礎上,開發者能夠根據須要捕捉感興趣的異常。

      JDK不少API之因此難用,一個很大的緣由就是檢查型異常的泛濫,如JavaMail、EJB以及JDBC等等,使用這些API,一堆堆異常處理的代碼 喧賓奪主式地侵入業務代碼中,破壞了代碼的整潔和優雅。數據庫


      Spring在org.springframework.dao包中提供了一套完備優雅的DAO異常體系,這些異常都繼承於 DataAccessException,而DataAccessException自己又繼承於 NestedRuntimeException,NestedRuntimeException異常以嵌套的方式封裝了源異常。由於雖然不一樣持久化技術的特定異常被轉換到Spring的DAO異常體系中,原始的異常信息並不會丟失,只要你願意,就能夠方便地經過getCause()方法獲取原始的異常信息。

       Spring的DAO異常體系並不和具體的實現技術相關,它從DAO概念的抽象層面定義了異常的目錄樹。在全部的持久化框架中,咱們並無發現擁有如此豐富語義異常體系的框架,Spring這種設計無疑是獨具匠心的,它使得開發人員關注某一特定語義的異常變得容易。在JDBC中的SQLException 中,你必須經過異常的getErrorCode()或getSQLState()獲取錯誤代碼,直接根據這些代碼判斷是錯誤的類型,這種過於底層的API 不但帶來了代碼編寫上的難度,並且也使代碼的移植變得困難,由於getErrorCode()是數據庫相關的。

       Spring以分類手法創建了異常分類目錄,對於大部分應用來講,這個異常分類目錄對異常類型的劃分具備適當的顆粒度。一方面,使開發者從底層細如針麻的 技術細節中脫身出來,另外一方面,能夠從這個語義豐富的異常體系中選擇感興趣的異常加以處理。圖 2列出了那些位於Spring DAO異常體系第一層次的異常類,每一個異常類下還可能擁有衆多的子異常
緩存

 

數據訪問對象DAO簡介  app

  1. DAO 表明數據訪問對象(Data Access Object),它描述了一個應用中DAO的角色,DAO的存在提供了讀寫數據庫中數據的一種方法,把這個功能經過接口提供對外服務,程序的其餘模塊經過這些接口來訪問數據庫,這樣會有不少好處,首先,因爲服務對象再也不和特定的接口實現綁定在一塊兒,使得它們易於測試,由於它提供的是一種服務,在不須要鏈接數據庫的條件下就能夠進行單元測試,極大地提升了開發效率。其次,經過使用與持久化技術無關的方法訪問數據庫,在應用程序的設計和使用上都有很大的靈活性,對於整個系統不管是在性能上仍是應用上也是一個巨大的飛躍。 
  2. DAO 全稱是(Data Access Object)數據訪問對象,它屬於O/R Mapping技術的一種。在O/R Mapping技術發佈以前,開發者 須要直接藉助於JDBC和SQL來完成與數據庫的相互通訊,在O/R Mapping技術出現以後,開發者可以使用DAO或其餘不一樣的DAO框架來實現與 RDBMS(關係數據庫管理系統)的交互。藉助於O/R Mapping技術,開發者可以將對象屬性映射到數據表的字段、將對象映射到RDBMS中、這 些Mapping技術可以爲應用自動建立高效的SQL語句等,除此以外,O/R Mapping技術還提供了延遲加載、緩存等高級特徵,而DAO是 O/R Mapping技術的一種實現,所以,使用DAO可以大量節省程序開發時間,減小代碼量和開發的成本。
  3. DAO的主要目的就是將持久性相關的問題與通常的業務規則和工做流隔離開來,它爲定義業務層能夠訪問的持久性操做引入了一個接口而且隱藏了實現的具體細節,該接口的功能將依賴於採用的持久性技術而改變,可是DAO接口能夠基本上保持不變。
  4. Spring 提供了一套抽象的DAO類,供開發者擴展,這有利於以統一的方式操做各類DAO技術,例如JDO、JDBC等,這些抽象DAO類提供了設置數據源及相關輔助信息的方法,而其中的一些方法同具體DAO技術相關。目前,Spring DAO抽象提供瞭如下幾種類:
  5. JdbcDaoSupport:JDBC DAO抽象類,開發者須要爲它設置數據源(DataSource),經過子類,開發者可以得到JdbcTemplate來訪問數據庫。  
  6. HibernateDaoSupport:Hibernate DAO抽象類。開發者須要爲它配置Hibernate SessionFactory。經過其子類,開發者可以得到Hibernate實現。  
  7. JdoDaoSupport:Spring爲JDO提供的DAO抽象類,開發者須要爲它配置PersistenceManagerFactory,經過其子類開發者可以得到JdoTemplate。  
  8. 在使用Spring的DAO框架進行數據庫存取時,無須接觸使用特定的數據庫技術,經過一個數據存取接口來操做便可。
相關文章
相關標籤/搜索