數據訪問對象

软件设计模式

計算機軟件中,數據訪問對象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 (英語). 

外部連結

編輯