數據訪問對象(DAO)設計模式 in Java

我的網站

數據訪問對象(DAO) 設計模式是一個非常受歡迎的實現 Java 應用中持久層的設計模式,它是基於抽象封裝設計原則並且避免應用受到來自持久層的改變所帶來的影響。比如說,將數據從 Oracle 換到 MySQL,或者將持久化從文件系統換到數據庫。這裏有這樣的具體例子,當我們將依賴關係型數據庫來做用戶認證的方案調整爲 LDAP 執行認證。如果我們使用了 DAO 設計模式來訪問數據庫,那些只需要在數據訪問層作出改變的操作會相對來說是安全的。DAO 設計模式同樣還能保證應用各部分之間的低耦合度,比如說視圖層是完全獨立於 DAO 層並且只有同樣是實現 DAO 接口的服務層才依賴於 DAO 層。

順便說下,DAO 或者 數據訪問對象模式不是 Gang of Four 中所說的 GOF 設計模式,Design Patterns: Elements of Reusable Object-Oriented Software。它不是任何一種面向對象的設計模式而是封裝的衍生。而它的好處就是將數據訪問層的代碼集中到一起,遠離業務邏輯代碼,這樣在不影響應用中其他層(模型、視圖層)的前提下能夠獨立的開發、優化。

此外我們還能通過 Generics 來模版化我們的 DAO 層。在使用 Spring 的時候我們可以利用 JdbcTemplate 來執行 JDBC 的調用,它能幫我們省掉不少公式化的重複的代碼。使用 DAO 設計模式來訪問數據是應遵循的 JDBC 最佳實踐中之一 。

在 Java 中什麼是 DAO 設計模式呢 ?

簡單說來 DAO 設計模式是一種用於減少業務邏輯和持久邏輯之間耦合度的方式。應用的業務邏輯通常需要用到域對象而它們一般是持久到數據庫、文件系統或者其它的持久存儲設備裏邊。 DAO 設計模式允許你將執行 CRUD 的操作代碼封裝起來而避免應用的其他部分執行這些操作,這就意味着那些應用中其他層已經被測試好的邏輯不會應爲持久層邏輯的更改受到影響。 DAO 設計模式也就讓應用能夠應付數據庫提供者或者持久技術的變動。

DAO 設計模式的好處

DAO 或者 數據訪問對象設計模式是一個抽象和封裝面向對象原則的不錯例子,它劃分出來的一個層叫做數據訪問層,應用在持久機制中有改變的情況下能夠做到安全的反饋。比如說,當我們從基於文件的持久機制切換到數據庫時,相應的改變會被限制到數據訪問層而不會影響到服務層或者與對象。數據訪問對象或者 DAO 設計模式在 Java 應用中是一個標準,已經應用到它的核心、web 應用和企業級應用中。下面是一些應用了 DAO 模式的 Java 應用:

1)  DAO 設計模式能夠使 JUnit test 運行的更快,通過創建 Mock 而不需要創建指向數據庫的鏈接來跑測試用例,通常創建 Mock 對象來做測試要比整合數據庫腰來的更容易。而且測試過程中如果碰到任何的問題都只需要檢查業務邏輯代碼而不用去關心數據庫。同時還避免了數據庫連接和環境問題

2) 因爲 DAO 設計模式是基於接口設計的,也就是說它擁有了面向對象設計原則“面向接口編程而非實現編程”所具有的靈活性和可維護性代碼的優勢。

如何在 Java J2EE 應用中應用 DAO 設計模式

下圖展示了在 Java 和 J2EE 應用中數據訪問模式是如何實現的。我們可以看到 DAO 的類,比如, AdressDAO, PersonDAO and CompanyDAO 是用來訪問數據庫然後將值填充到一個 Contact 對象中。

客戶端服務程序不是直接訪問上述的類取而代之的是通過 ContactDAO 接口來訪問它們,而此接口的對象是由 ContactDAOFactory 根據數據庫廠商所實現的 DAO 類創建出來的。比如,我們現在獲得的是可以訪問 HSQL DB 的類。相應的我們也可以返回能夠訪問 Oracle、SQL Server or MySQL 等的數據庫訪問類。

Screen Shot 2016-02-29 at 22.41.01

DAO 設計模式例子

數據訪問對象或 DAO 設計模式的核心是 Java 接口,在裏邊可以定義各種有關 CRUD 的操作,比如 Create, Read, Update and Delete。根據我們應用的後端技術的區別我們可以創建這個接口的不同實現方案,比如,JdbcDAOImpl 用 JDBC 來連接數據庫, HibernateDAOImpl 來訪問 Hibernate, FileDAOImpl,但我們使用的是文件系統來持久化數據。服務層使用了這個數據訪問對象那麼就可以通過接口與數據訪問層做交互。這裏是一個典型的 DAO 接口的例子:

public interface AccountDAO{
public boolean save(Account account);
public boolean update(Account account);
public boolean findByAccountNumber(int accountNumber);
public boolean delete(Account account);
}

上邊的代碼定義了幾個關於 CRUD 操作的方法。現在我們可以創建基於這個接口的不同實現。比如,JdbcAccountDAOImpl or HibernateAccountDAOImpl。我們的 JdbcAccountDAOImpl 將會把 SQL 查詢語句通過 JDBC API 或者 Spring JdbcTemplate 執行 CRUD 查詢。

這就是所有關於 Java 裏邊 數據訪問對象 or DAO 設計模式是什麼以及在 Java 應用中使用 DAO 設計模式的優勢有哪些。我們也看了一個如何用 AccountDAO 接口來實現數據訪問對象 設計模式的例子。在 Java 應用中通過 DAO 設計模式來創建持久層是 JDBC 實踐中的一種。


翻譯原文

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章