DAO设计模式

时间:2020-02-23 14:41:17  来源:igfitidea点击:

DAO代表数据访问对象。
DAO设计模式用于在单独的层中分离数据持久性逻辑。
这样,该服务完全不了解如何完成访问数据库的低级操作。
这就是所谓的逻辑分离原理。

DAO设计模式

使用DAO设计模式,我们具有设计所依赖的以下组件:

  • 从一层转移到另一层的模型。

  • 提供灵活设计的接口。

  • 接口实现是持久性逻辑的具体实现。

实施DAO模式

使用上述组件,我们尝试实现DAO模式。
我们将在这里使用3个组件:

  • Book模型从一层转移到另一层。

  • BookDao接口提供了灵活的设计和API来实现。

  • BookDaoImpl具体类,是BookDao接口的实现。

让我们将此逻辑放入图表中:

DAO模式模型类

现在,让我们建立模型对象。

package com.theitroad.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
}

这是一个简单的对象,只有2个属性,可以使事情保持简单。

DAO模式界面

让我们定义一个接口,以持久性级别访问与其关联的数据。

package com.theitroad.dao;

import com.theitroad.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.theitroad.daoimpl;

import com.theitroad.dao.BookDao;
import com.theitroad.model.Books;

import java.util.ArrayList;
import java.util.List;

public class BookDaoImpl implements BookDao {

  //list is working as a database
  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);
  }
}

使用DAO模式

最后,我们在main()方法中使用此实现:

package com.theitroad;

import com.theitroad.dao.BookDao;
import com.theitroad.daoimpl.BookDaoImpl;
import com.theitroad.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());
      }

      //update student
      Books book = bookDao.getAllBooks().get(1);
      book.setBookName("Algorithms");
      bookDao.saveBook(book);
  }
}

DAO模式的优势

使用DAO模式有很多优点。
让我们在这里说明其中一些:

  • 在更改持久性机制时,服务层甚至不必知道数据来自何处。
    例如,如果您打算从使用MySQL过渡到MongoDB,则所有更改仅需要在DAO层中完成。

  • DAO模式强调应用程序不同组件之间的低耦合。
    因此,视图层不依赖于DAO层,而仅服务层依赖于DAO层,即使依赖于接口,也不依赖于具体的实现。

  • 由于持久性逻辑是完全独立的,因此为单个组件编写单元测试要容易得多。
    例如,如果您将JUnit和Mockito用于测试框架,则可以轻松模拟应用程序的各个组件。

  • 当我们以DAO模式使用接口时,它还强调了"使用接口代替实现"的风格,这是一种出色的OOPs编程风格。