Открыть сервис

Data Access Objects

Data Access Objects (DAO, объекты доступа к данным) — это шаблон проектирования, используемый в разработке программного обеспечения для абстрагирования и инкапсуляции операций доступа к хранилищу данных, такому как база данных, файловая система или внешний сервис. Основная цель DAO — отделить бизнес-логику приложения от деталей реализации уровня хранения данных, обеспечивая унифицированный интерфейс для выполнения операций создания, чтения, обновления и удаления (CRUD) без привязки к конкретной технологии базы данных или API.

История и происхождение

Концепция DAO получила широкое распространение в конце 1990-х — начале 2000-х годов в контексте разработки корпоративных приложений на Java (J2EE), где данный шаблон был систематизирован в каталоге «шаблонов проектирования Core J2EE» группы Sun Microsystems. Идея опиралась на более общий принцип «разделения ответственности» (Separation of Concerns), в рамках которого доступ к данным выделяется в отдельный слой. Зарождение подхода связано с необходимостью упростить тестирование и повторное использование кода: разработчики могли писать бизнес-логику, не зная, как именно будут сохраняться объекты, а замену базы данных (например, с MySQL на PostgreSQL или на XML-файлы) можно было осуществить заменой реализации DAO без изменения остальных частей приложения.

Основные принципы

DAO базируется на нескольких ключевых идеях:

Различия с другими шаблонами

В литературе и на практике шаблон DAO часто сравнивается с Repository. Основное различие состоит в уровне абстракции:

DAO также следует отличать от Active Record (популярного в Ruby on Rails, ASP.NET MVC с Entity Framework, Yii2), где объект предметной области сам содержит методы для сохранения и загрузки данных, нарушая принцип единственной ответственности.

Структура и примеры реализации

### Типичная структура классов

На примере Java:

  1. Класс предметной областиUser с полями id, name, email.
  2. Интерфейс DAOUserDao с методами void save(User user), User findById(int id), List<User> findAll(), void update(User user), void delete(User user).
  3. Конкретная реализацияUserDaoJdbcImpl, использующая JDBC и SQL-запросы.
  4. Фабрика или DI-контейнер, предоставляющий экземпляр реализации вызывающему коду.

### Пример на Java с JDBC

``java public interface UserDao { User findById(int id); List<User> findAll(); void save(User user); void update(User user); void delete(int id); } ``

Реализация для MySQL может содержать: ``java public class UserDaoJdbcImpl implements UserDao { private Connection connection = ... // получение через DataSource @Override public User findById(int id) { String sql = "SELECT FROM users WHERE id = ?"; try (PreparedStatement stmt = connection.prepareStatement(sql)) { stmt.setInt(1, id); ResultSet rs = stmt.executeQuery(); if (rs.next()) { return new User(rs.getInt("id"), rs.getString("name"), rs.getString("email")); } } catch (SQLException e) { / обработка */ } return null; } // прочие методы... } ``

### Пример на PHP (PDO)

``php class UserDao { private $pdo; public function __construct(PDO $pdo) { $this->pdo = $pdo; } public function findById($id) { $stmt = $this->pdo->prepare('SELECT * FROM users WHERE id = ?'); $stmt->execute([$id]); return $stmt->fetchObject('User'); } } ``

Преимущества и недостатки

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

### Недостатки

Применение

DAO широко применяется в многослойных архитектурах веб-приложений (Java Spring, PHP Laravel/Symfony, Python Django/Flask с ORM, C# ASP.NET). В современных фреймворках роль DAO часто берут на себя ORM (Hibernate, Doctrine, Entity Framework Core, SQLAlchemy), которые предоставляют готовый слой доступа к данным, однако разработчики могут дополнительно писать пользовательские DAO-классы для операций, не покрываемых стандартными методами.

В микросервисной архитектуре DAO часто используются на уровне каждого микросервиса, где они являются мостом между бизнес-логикой и базой данных этого сервиса.

Связь с другими паттернами

Интересные факты

Источники

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →