CyStack logo
  • Sản phẩm & Dịch vụ
  • Giải pháp
  • Bảng giá
  • Công ty
  • Tài liệu
Vi

vi

Trang chủHướng dẫnDAO Design Pattern: Cấu trúc, lợi ích và cách sử dụng
Java

DAO Design Pattern: Cấu trúc, lợi ích và cách sử dụng

CyStack blog 3 phút để đọc
CyStack blog29/07/2025
Locker Avatar

Bao Tran

Web Developer

Locker logo social
Reading Time: 3 minutes

DAO là viết tắt của Data Access Object (Đối tượng truy cập dữ liệu). DAO Design Pattern được sử dụng để tách biệt logic lưu trữ dữ liệu sang một lớp riêng biệt. Nhờ vậy, lớp dịch vụ không phải quan tâm đến cách thức thực hiện các thao tác cấp thấp để truy cập cơ sở dữ liệu. Đây chính là nguyên tắc Separation of Logic.

DAO Design Pattern

Với DAO Design Pattern, thiết kế được xây dựng dựa trên các thành phần sau:

  • Model: Là đối tượng dữ liệu sẽ được truyền qua lại giữa các tầng.
  • Interface: Cung cấp thiết kế linh hoạt, định nghĩa các hành vi cần triển khai.
  • Interface Implementation: Là lớp triển khai cụ thể phần logic lưu trữ dữ liệu.

Triển khai DAO Pattern

Dựa trên các thành phần đã đề cập, chúng ta sẽ thử triển khai DAO Design Pattern. Trong ví dụ này, chúng ta sử dụng 3 thành phần:

  • Book model được truyền giữa các lớp.
  • BookDao interface cung cấp thiết kế linh hoạt và API để triển khai.
  • BookDaoImpl là lớp cụ thể, triển khai các phương thức được định nghĩa trong BookDaoBookDao.

Hãy biểu diễn logic này dưới dạng sơ đồ:

DAO Pattern

Mẫu lớp mô hình trong DAO Pattern

Bây giờ, chúng ta sẽ tạo đối tượng mô hình.

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 methods
}

Để ví dụ dễ hiểu, ở đây chúng ta sẽ dùng một đối tượng đơn giản chỉ gồm 2 thuộc tính.

Giao diện trong DAO Pattern

Tiếp theo, chúng ta định nghĩa một interface để truy cập dữ liệu ở tầng lưu trữ.

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);
}

Triển khai DAO Pattern

Kế đến, chúng ta tạo một lớp cụ thể triển khai interface vừa định nghĩa.

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 {

    // danh sách hoạt động như một cơ sở dữ liệu
    private List<Books> 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<Books> 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);
    }
}

Sử dụng DAO Pattern

Cuối cùng, chúng ta sử dụng triển khai này trong phương thức 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());
        }

        // cập nhật sách
        Books book = bookDao.getAllBooks().get(1);
        book.setBookName("Algorithms");
        bookDao.saveBook(book);
    }
}

Lợi ích của DAO Pattern

Có nhiều lợi ích khi sử dụng DAO Pattern. Dưới đây là một số điểm đáng chú ý:

  • Khi thay đổi cơ chế lưu trữ, lớp dịch vụ hoàn toàn không cần biết dữ liệu đến từ đâu. Ví dụ, nếu bạn muốn chuyển từ MySQL sang MongoDB, mọi thay đổi chỉ cần thực hiện tại tầng DAO.
  • DAO Pattern đề cao cơ chế liên kết lỏng lẻo (low coupling) giữa các thành phần trong ứng dụng. Vì vậy, tầng View không có sự phụ thuộc vào tầng DAO và tầng Service chỉ tương tác với DAO thông qua các interface, thay vì phụ thuộc trực tiếp vào các lớp triển khai cụ thể.
  • Do logic lưu trữ dữ liệu được tách biệt hoàn toàn nên việc viết Unit test cho từng thành phần độc lập trở nên đơn giản hơn. Chẳng hạn, nếu sử dụng JUnit và Mockito làm framework kiểm thử, bạn có thể dễ dàng giả lập (mock) các thành phần riêng lẻ trong ứng dụng.
  • Việc sử dụng interface trong DAO Pattern cũng góp phần thúc đẩy phong cách lập trình “làm việc với interface thay vì hiện thực cụ thể” — một nguyên tắc nền tảng trong lập trình hướng đối tượng.

Kết luận về DAO Pattern

Trong bài viết này, chúng ta đã tìm hiểu cách áp dụng DAO Design Pattern để tách biệt logic lưu trữ dữ liệu, từ đó giúp các thành phần trong hệ thống ít phụ thuộc lẫn nhau (loose coupling). Các mẫu thiết kế chỉ là những phương pháp lập trình có tổ chức, do đó, chúng không phụ thuộc vào ngôn ngữ hay framework cụ thể. Bạn có thể để lại ý kiến ở phần bình luận bên dưới. Tải ví dụ về dự án DAO từ liên kết dưới đây.

Tải dự án mẫu DAO Pattern

Tài liệu tham khảo: Oracle Documentation, Wikipedia.

0 Bình luận

Đăng nhập để thảo luận

Chuyên mục Hướng dẫn

Tổng hợp các bài viết hướng dẫn, nghiên cứu và phân tích chi tiết về kỹ thuật, các xu hướng công nghệ mới nhất dành cho lập trình viên.

Đăng ký nhận bản tin của chúng tôi

Hãy trở thành người nhận được các nội dung hữu ích của CyStack sớm nhất

Xem chính sách của chúng tôi Chính sách bảo mật.

Đăng ký nhận Newsletter

Nhận các nội dung hữu ích mới nhất