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