數據訪問對象

软件设计模式

電腦軟件中,數據訪問對象data access objectDAO)是為某種類型的資料庫或其他永續性機制提供一個抽象介面對象。通過對映應用程式對持久層的呼叫,DAO提供一些特定的數據操作,而無需暴露資料庫細節。這種隔離支援單一功能原則。它分離了應用程式需要訪問哪些數據,就域特定對象和資料類型(DAO的公共介面),而言,這些需求可以用資料庫管理系統(DBMS)、資料庫模式等滿足(DAO的實現)。

儘管這種設計模式同樣適用於以下內容:1、大多數程式語言;2、有持久化需求的大多數軟件類型;3、大多數資料庫。它在傳統上與Java EE應用程式和關聯式資料庫相關(通過JDBC API訪問,因為它源於Sun Microsystems的最佳實踐指南[1],該平台的「核心J2EE模式」)。

優點

使用數據訪問對象的優點是應用程式的兩個重要部分之間相對簡單並嚴格分離,它們可以但不應該彼此了解任何東西,並且兩者可預期的頻繁和獨立發展。改變業務邏輯可以依賴於相同的DAO介面,而對永續性邏輯的更改只要介面保持正確實現,就不會影響DAO客戶端。儲存的所有細節都隱藏在應用程式的其餘部分中(見資訊隱藏英語Information hiding)。因此,可以修改一個DAO實現而不影響應用程式的其餘部分,從而可能實現對永續性機制的更改。DAO充當了應用程式與資料庫之間的中介,它們在對象與資料庫記錄之間來迴轉移數據。用測試替身英語Test double取代DAO可以促進代碼的單元測試,使測試不依賴於持久層。

Java程式語言的非特定上下文中,數據訪問對象作為一項設計概念可以用多種方式實現。這可以將應用程式中的數據訪問部分分離為非常簡單的介面,遷移到框架或商業產品。DAO編碼範例可能需要一些技巧。像是Java Persistence API英語Java Persistence APIEnterprise JavaBeans之類的技術已內建在應用程式伺服器中,可以在JavaEE應用程式伺服器的應用程式中使用。商業產品如TopLink可以在基於對象關係對映(ORM)的產品上使用。流行的開源ORM產品包括Doctrine (PHP)HibernateiBATIS,以及JPA實現(例如Apache OpenJPA英語Apache OpenJPA)。

缺點

使用DAO的潛在缺點包括抽象泄漏[來源請求]代碼重複抽象反演英語Abstraction inversion。尤其是將DAO作為常規Java對象的抽象會隱藏每個資料庫訪問的高成本,並且可能強迫開發人員觸發多個資料庫查詢來檢索普通SQL查詢中一次就可取回的資訊。如果一個應用程式需要多個DAO,人們可能發現自己對每個DAO重複基本上相同的建立、讀取、更新和刪除代碼。不過,也可以實現一個處理常用操作的通用DAO來避免樣板化代碼。[2]

工具和框架

參見

參考資料

  1. ^ Core J2EE Patterns - Data Access Objects. Sun Microsystems Inc. 2007-08-02 [2017-06-10]. (原始內容存檔於2012-04-09). 
  2. ^ See http://www.ibm.com/developerworks/java/library/j-genericdao/index.html頁面存檔備份,存於互聯網檔案館) for workarounds
  3. ^ Hodgson, Kyle; Reid, Darren. ServiceStack 4 Cookbook. Packt Publishing Ltd. : Chapter 4 [22 June 2016]. ISBN 9781783986576 (英語). 

外部連結