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