DAO означает Data Access Object. DAO шаблон проектирования используется для разделения логики сохранения данных в отдельный слой. Таким образом, сервис полностью остается в неведении о том, как выполняются низкоуровневые операции доступа к базе данных. Это известно как принцип разделения логики.
Шаблон проектирования DAO
С шаблоном проектирования DAO мы имеем следующие компоненты, от которых зависит наш дизайн:
- Модель, которая передается из одного слоя в другой.
- Интерфейсы, которые обеспечивают гибкий дизайн.
- Реализация интерфейса, которая является конкретной реализацией логики сохранения.
Реализация шаблона DAO
С использованием вышеуказанных компонентов, давайте попробуем реализовать шаблон DAO. Здесь мы будем использовать 3 компонента:
- Модель
Book
, которая передается из одного слоя в другой. - Интерфейс
BookDao
, который обеспечивает гибкий дизайн и API для реализации. - Класс
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;
}
// методы доступа к свойствам
}
Это простой объект с двумя свойствами для простоты.
Интерфейс для шаблона 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 по ссылке ниже.
Скачать пример проекта на шаблоне DAO
Ссылки: Документация Oracle, Википедия.
Source:
https://www.digitalocean.com/community/tutorials/dao-design-pattern