Введение
Абстрактный интерфейс к компьютерной базе данных – шаблон проектирования программного обеспечения.
the software design pattern
В программном обеспечении объект доступа к данным (DAO) – это шаблон, предоставляющий абстрактный интерфейс к определенному типу базы данных или другому механизму постоянного хранения данных. Сопоставляя вызовы приложений с уровнем постоянного хранения, DAO обеспечивает операции с данными, не раскрывая деталей базы данных. Такая изоляция поддерживает принцип единственной ответственности. Он отделяет доступ к данным, необходимый приложению, в терминах объектов предметной области и типов данных (публичный интерфейс DAO), от способов удовлетворения этих потребностей с помощью конкретной СУБД (реализация DAO). Хотя этот шаблон проектирования применим к большинству языков программирования, большинству программного обеспечения, требующего постоянного хранения данных, и большинству баз данных, он традиционно ассоциируется с приложениями Java EE и реляционными базами данных (доступ к которым осуществляется через JDBC API, что связано с его происхождением из рекомендаций Sun Microsystems по лучшим практикам "Core J2EE Patterns"). Этот объект можно найти на уровне доступа к данным в трехзвенной архитектуре. Существуют различные способы реализации этого объекта:
Один DAO для каждой таблицы. Один DAO для всех таблиц для конкретной СУБД. В случае, когда запрос SELECT ограничен только целевой таблицей и не может включать JOIN, UNION, подзапросы и общие табличные выражения (CTE).
В случае, когда запрос SELECT может содержать любые конструкции, разрешенные СУБД.
One DAO for each table. One DAO for all the tables for a particular DBMS. Where the SELECT query is limited only to its target table and cannot incorporate JOINS, UNIONS, subqueries and Common Table Expressions (CTEs)
Where the SELECT query can contain anything that the DBMS allows.
Преимущества
Использование объектов доступа к данным (DAO) дает явное преимущество: оно разделяет две части приложения, которым необязательно знать о существовании друг друга. Это разделение позволяет им развиваться независимо. Если изменяется бизнес-логика, она может опираться на стабильный интерфейс DAO. В то же время, модификации логики постоянного хранения не затронут клиентов DAO. Все детали хранения данных скрыты от остальной части приложения (см. принцип сокрытия информации). Юнит-тестирование упрощается за счет подмены DAO в тесте на тестовой заглушкой, что делает тесты независимыми от слоя постоянного хранения. В контексте языка программирования Java, DAO может быть реализован различными способами – от простого интерфейса, отделяющего доступ к данным от логики приложения, до фреймворков и коммерческих продуктов. Технологии, такие как Java Persistence API и Enterprise JavaBeans, встроены в серверы приложений и могут использоваться в приложениях, работающих на сервере приложений Java EE. Коммерческие продукты, такие как TopLink, доступны на основе объектно-реляционного отображения (ORM). Популярное программное обеспечение с открытым исходным кодом для ORM включает в себя Doctrine, Hibernate, iBATIS и реализации JPA, такие как Apache OpenJPA.
Недостатки
Потенциальные недостатки использования DAO включают в себя "протекающую" абстракцию, дублирование кода и инверсию абстракции. В частности, представление DAO как обычного Java-объекта может скрывать высокую стоимость каждого обращения к базе данных. Разработчики могут непреднамеренно выполнять несколько запросов к базе данных для получения информации, которую можно было бы вернуть одной операцией. Если приложению требуется несколько DAO, один и тот же код для создания, чтения, обновления и удаления может потребоваться написать для каждого DAO. Важно отметить, что эти недостатки проявляются только при наличии отдельного DAO для каждой таблицы и ограничении запросов SELECT доступом только к целевой таблице.