В каких случаях и почему вы используете Spring JDBC вместо JPA/Hibernate?

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

Ответ

Spring JDBC используется, когда необходим прямой контроль над SQL-запросами и максимальная производительность, а сложности ORM (Object-Relational Mapping) избыточны или вредны.

Основные причины выбора Spring JDBC:

  1. Производительность: Меньшие накладные расходы по сравнению с Hibernate (нет кэшей, отслеживания состояния, генерации сложного SQL).
  2. Контроль над SQL: Позволяет писать и оптимизировать запросы вручную, что критично для сложных отчетов или операций с большими объемами данных.
  3. Простота: Легковесная абстракция, которая убирает boilerplate код (закрытие соединений, обработка исключений), но не скрывает реляционную модель.
  4. Прозрачность: Легче отлаживать, так как выполняемый SQL полностью контролируется разработчиком.

Типичные сценарии использования:

  • Приложения, работающие в основном со сложными SELECT (отчетность, аналитика).
  • Высоконагруженные сервисы, где важна каждая миллисекунда.
  • Работа с легационными базами данных или нестандартными SQL-конструкциями.
  • Простые CRUD-операции без сложной объектной графовой модели.

Пример:

@Repository
public class UserRepository {
    private final JdbcTemplate jdbcTemplate;

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

    public List<User> findActiveUsers() {
        String sql = "SELECT id, name, email FROM users WHERE active = true";
        // RowMapper обеспечивает явное и эффективное отображение
        return jdbcTemplate.query(sql, (rs, rowNum) -> 
            new User(rs.getLong("id"), rs.getString("name"), rs.getString("email"))
        );
    }
}

Spring JDBC — это инструмент для ситуаций, когда SQL — это решение, а не проблема, которую нужно скрыть.