В программном обеспечении объект доступа к данным ( DAO ) — это шаблон, который предоставляет абстрактный интерфейс для некоторого типа базы данных или другого механизма сохранения . Сопоставляя вызовы приложений с уровнем сохранения, DAO обеспечивает операции с данными, не раскрывая детали базы данных. Эта изоляция поддерживает принцип единой ответственности . Он отделяет доступ к данным, необходимый приложению, с точки зрения объектов и типов данных, специфичных для домена (открытый интерфейс DAO), от того, как эти потребности могут быть удовлетворены с помощью конкретной СУБД (реализация DAO).
Хотя этот шаблон проектирования применим к большинству языков программирования, большинству программного обеспечения, требующего сохранения данных, и большинству баз данных, он традиционно ассоциируется с приложениями Java EE и реляционными базами данных (доступ к которым осуществляется через JDBC API из-за его происхождения из рекомендаций Sun Microsystems [1] «Основные шаблоны J2EE»).
Этот объект можно найти на уровне доступа к данным трехуровневой архитектуры .
Существуют различные способы реализации этого объекта:
Использование объектов доступа к данным (DAO) дает явное преимущество: оно разделяет две части приложения, которым не нужно знать друг о друге. Такое разделение позволяет им развиваться независимо. Если бизнес-логика изменится, она может положиться на согласованный интерфейс DAO. Между тем, изменения в логике сохранения не повлияют на клиентов DAO. [2] [3]
Все детали хранилища скрыты от остальной части приложения (см. скрытие информации ). Код модульного тестирования упрощается путем замены тестового двойника на DAO в тесте, тем самым делая тесты независимыми от слоя сохранения.
В контексте языка программирования Java DAO может быть реализован различными способами. Это может варьироваться от довольно простого интерфейса, который отделяет доступ к данным от логики приложения, до фреймворков и коммерческих продуктов.
Такие технологии, как Java Persistence API и Enterprise JavaBeans, встроены в серверы приложений и могут использоваться в приложениях, использующих сервер приложений Java EE. Коммерческие продукты, такие как TopLink, доступны на основе объектно-реляционного отображения (ORM). Популярное программное обеспечение ORM с открытым исходным кодом включает Doctrine , Hibernate , iBATIS и реализации JPA, такие как Apache OpenJPA . [4]
Потенциальные недостатки использования DAO включают дырявую абстракцию , [ требуется цитата ] дублирование кода и инверсию абстракции . В частности, абстракция DAO как обычного объекта Java может скрыть высокую стоимость каждого доступа к базе данных. Разработчики могут непреднамеренно сделать несколько запросов к базе данных для получения информации, которая может быть возвращена за одну операцию. Если приложению требуется несколько DAO, для каждого DAO может потребоваться написать один и тот же код создания, чтения, обновления и удаления. [5]
Обратите внимание, что эти недостатки проявляются только в том случае, если для каждой таблицы имеется отдельный DAO и запрос SELECT не может получить доступ ни к чему, кроме целевой таблицы.