Что такое DAO в контексте Spring?

«Что такое DAO в контексте Spring?» — вопрос из категории Spring, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

DAO (Data Access Object) — это паттерн проектирования, который абстрагирует и инкапсулирует доступ к источнику данных (БД, внешний API). В Spring он реализуется для отделения бизнес-логики от деталей доступа к данным.

Ключевые моменты:

  • Цель: Предоставить чистый API для операций CRUD, скрывая специфику JDBC, JPA, Hibernate или других технологий.
  • Реализация: Обычно это интерфейс и его реализация, аннотированные как Spring-компоненты (@Repository).
  • Преимущества: Упрощает тестирование (можно подменить mock-реализацией), централизует обработку исключений доступа к данным.

Пример интерфейса и реализации:

// Интерфейс DAO
public interface UserDao {
    User findById(Long id);
    List<User> findAll();
    void save(User user);
}

// Реализация с использованием JdbcTemplate
@Repository
public class JdbcUserDao implements UserDao {
    private final JdbcTemplate jdbcTemplate;

    public JdbcUserDao(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    @Override
    public User findById(Long id) {
        String sql = "SELECT * FROM users WHERE id = ?";
        return jdbcTemplate.queryForObject(sql, new UserRowMapper(), id);
    }
    // ... другие методы
}

Spring аннотация @Repository также автоматически транслирует специфичные исключения доступа к данным в Spring-исключения DataAccessException.