DAO代表資料訪問對象。DAO設計模式用於將數據持久性邏輯分離到單獨的層中。這樣,服務完全不知道如何完成訪問數據庫的低級操作。這被稱為“邏輯分離”原則。
DAO設計模式
使用DAO設計模式,我們依賴以下組件:
- 從一個層轉移到另一個層的模型。
- 提供靈活設計的接口。
- 接口實現是持久性邏輯的具體實現。
實現DAO模式
使用上述組件,讓我們嘗試實現DAO模式。我們將在這裡使用3個組件:
- 從一個層轉移到另一個層的
Book
模型。 - 提供靈活設計和實現API的
BookDao
接口。 BookDaoImpl
是BookDao
接口的具體實現類。
讓我們將這個邏輯放入一個圖表中:
DAO 模式模型類
現在,讓我們提出我們的模型對象。
package com.journaldev.model;
public class Books {
private int isbn;
private String bookName;
public Books() {
}
public Books(int isbn, String bookName) {
this.isbn = isbn;
this.bookName = bookName;
}
// getter setter 方法
}
這是一個簡單的對象,只有 2 個屬性,以保持簡單。
DAO 模式接口
讓我們定義接口,以在持久性層次上訪問與其關聯的數據。
package com.journaldev.dao;
import com.journaldev.model.Books;
import java.util.List;
public interface BookDao {
List<Books> getAllBooks();
Books getBookByIsbn(int isbn);
void saveBook(Books book);
void deleteBook(Books book);
}
DAO 模式實現
接下來,我們創建一個實現上述接口的具體類。
package com.journaldev.daoimpl;
import com.journaldev.dao.BookDao;
import com.journaldev.model.Books;
import java.util.ArrayList;
import java.util.List;
public class BookDaoImpl implements BookDao {
// 列表正在作為一個數據庫
private List books;
public BookDaoImpl() {
books = new ArrayList<>();
books.add(new Books(1, "Java"));
books.add(new Books(2, "Python"));
books.add(new Books(3, "Android"));
}
@Override
public List getAllBooks() {
return books;
}
@Override
public Books getBookByIsbn(int isbn) {
return books.get(isbn);
}
@Override
public void saveBook(Books book) {
books.add(book);
}
@Override
public void deleteBook(Books book) {
books.remove(book);
}
}
使用 DAO 模式
最後,我們將此實現應用於我們的main()方法:
package com.journaldev;
import com.journaldev.dao.BookDao;
import com.journaldev.daoimpl.BookDaoImpl;
import com.journaldev.model.Books;
public class AccessBook {
public static void main(String[] args) {
BookDao bookDao = new BookDaoImpl();
for (Books book : bookDao.getAllBooks()) {
System.out.println("Book ISBN : " + book.getIsbn());
}
//更新學生
Books book = bookDao.getAllBooks().get(1);
book.setBookName("Algorithms");
bookDao.saveBook(book);
}
}
DAO模式的優勢
使用DAO模式有許多優點。讓我們在這裡列舉一些:
- 在更改持久性機制時,服務層甚至不需要知道數據來源。例如,如果您考慮從使用MySQL轉換為MongoDB,則所有更改僅需要在DAO層中進行。
- DAO模式強調應用程序不同組件之間的低耦合。因此,視圖層不依賴於DAO層,僅服務層依賴於它,即使是通過接口而不是具體實現。
- 由於持久性邏輯完全分開,因此更容易為個別組件編寫單元測試。例如,如果您使用JUnit和Mockito進行測試框架,將很容易模擬應用程序的各個組件。
- 由於我們在DAO模式中使用接口,因此它還強調“使用接口而不是實現”這種優秀的面向對象編程風格。
DAO模式結論
在這篇文章中,我們學到了如何使用DAO設計模式,強調將持久性邏輯保持分離,從而使我們的組件松耦合。設計模式只是一種基於編程方式的方法,因此與語言和框架無關。歡迎在下面的評論中分享您的觀點。從以下鏈接下載DAO示例項目。
Source:
https://www.digitalocean.com/community/tutorials/dao-design-pattern