DAO 設計模式

DAO代表資料訪問對象。DAO設計模式用於將數據持久性邏輯分離到單獨的層中。這樣,服務完全不知道如何完成訪問數據庫的低級操作。這被稱為“邏輯分離”原則。

DAO設計模式

使用DAO設計模式,我們依賴以下組件:

  • 從一個層轉移到另一個層的模型。
  • 提供靈活設計的接口
  • 接口實現是持久性邏輯的具體實現。

實現DAO模式

使用上述組件,讓我們嘗試實現DAO模式。我們將在這裡使用3個組件:

  1. 從一個層轉移到另一個層的Book模型。
  2. 提供靈活設計和實現API的BookDao接口。
  3. BookDaoImplBookDao 接口的具體實現類。

讓我們將這個邏輯放入一個圖表中:

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模式有許多優點。讓我們在這裡列舉一些:

  1. 在更改持久性機制時,服務層甚至不需要知道數據來源。例如,如果您考慮從使用MySQL轉換為MongoDB,則所有更改僅需要在DAO層中進行。
  2. DAO模式強調應用程序不同組件之間的低耦合。因此,視圖層不依賴於DAO層,僅服務層依賴於它,即使是通過接口而不是具體實現。
  3. 由於持久性邏輯完全分開,因此更容易為個別組件編寫單元測試。例如,如果您使用JUnit和Mockito進行測試框架,將很容易模擬應用程序的各個組件。
  4. 由於我們在DAO模式中使用接口,因此它還強調“使用接口而不是實現”這種優秀的面向對象編程風格。

DAO模式結論

在這篇文章中,我們學到了如何使用DAO設計模式,強調將持久性邏輯保持分離,從而使我們的組件松耦合。設計模式只是一種基於編程方式的方法,因此與語言和框架無關。歡迎在下面的評論中分享您的觀點。從以下鏈接下載DAO示例項目。

下載DAO設計模式示例項目

參考資料:Oracle文檔維基百科

Source:
https://www.digitalocean.com/community/tutorials/dao-design-pattern