Введение

Абстрактный интерфейс к компьютерной базе данных – шаблон проектирования программного обеспечения.

В программном обеспечении объект доступа к данным (DAO) – это шаблон, предоставляющий абстрактный интерфейс к определенному типу базы данных или другому механизму постоянного хранения данных. Сопоставляя вызовы приложений с уровнем постоянного хранения, DAO обеспечивает операции с данными, не раскрывая деталей базы данных. Такая изоляция поддерживает принцип единственной ответственности. Он отделяет доступ к данным, необходимый приложению, в терминах объектов предметной области и типов данных (публичный интерфейс DAO), от способов удовлетворения этих потребностей с помощью конкретной СУБД (реализация DAO). Хотя этот шаблон проектирования применим к большинству языков программирования, большинству программного обеспечения, требующего постоянного хранения данных, и большинству баз данных, он традиционно ассоциируется с приложениями Java EE и реляционными базами данных (доступ к которым осуществляется через JDBC API, что связано с его происхождением из рекомендаций Sun Microsystems по лучшим практикам "Core J2EE Patterns"). Этот объект можно найти на уровне доступа к данным в трехзвенной архитектуре. Существуют различные способы реализации этого объекта:
Один DAO для каждой таблицы. Один DAO для всех таблиц для конкретной СУБД. В случае, когда запрос SELECT ограничен только целевой таблицей и не может включать JOIN, UNION, подзапросы и общие табличные выражения (CTE).
В случае, когда запрос SELECT может содержать любые конструкции, разрешенные СУБД.

Преимущества

Использование объектов доступа к данным (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 доступом только к целевой таблице.