JDBC и работа с БД
Тема дорожной карты · Java
Операции с базой данных JDBC охватывают полный диапазон действий манипуляции данными и управления транзакциями, которые Java-приложение может выполнять против реляционной базы данных через API java.sql, выходя за рамки базовых запросов к транзакциям, пакетным обновлениям, хранимым процедурам и проверке метаданных. Управление транзакциями в операциях JDBC с базой данных сосредоточено на объекте Connection: connection.setAutoCommit(false) начинает транзакцию, после чего DML-операции пакетируются в движке базы данных до тех пор, пока connection.commit() не сделает их долговременными или connection.rollback() не отменит их — Savepoint-ы позволяют частичный откат внутри транзакции. Пакетные обновления через PreparedStatement.addBatch() и executeBatch() значительно повышают пропускную способность для массовых вставок и обновлений, отправляя несколько SQL-операторов в базу данных в единственном сетевом round-trip, сокращая задержку с O(n) round-trips до O(1). CallableStatement расширяет PreparedStatement для вызова хранимых процедур и функций, регистрируя OUT-параметры через registerOutParameter(index, Types.BIGINT) и получая результаты после execute(). В современных Spring-приложениях JdbcTemplate и NamedParameterJdbcTemplate оборачивают операции JDBC с базой данных в тонкий, транслирующий исключения слой, отображающий SQLException в иерархию DataAccessException Spring и устраняющий шаблонный код управления ресурсами, тогда как Spring Data JPA добавляет полный ORM-слой поверх JDBC через Hibernate для приложений, предпочитающих доступ к данным, ориентированный на сущности.
Как это работает
JDBC и работа с БД (Java Database Connectivity) — стандартный SQL-API: DriverManager.getConnection, PreparedStatement, ResultSet. Connection pooling (HikariCP — де факто) обязателен в production. Higher-level абстракции: JPA / Hibernate (ORM), Spring Data JPA, jOOQ (type-safe SQL DSL), MyBatis (mapper-based). Для Spring Boot — Spring Data JPA + Flyway/Liquibase для миграций (конвенциональный стек).
Когда применять
Всегда PreparedStatement с параметрами (?) — никогда не конкатенируйте SQL с user-input. HikariCP для pool (разумнее defaults, чем DBCP). JPA/Hibernate — для CRUD-heavy приложений, где ORM экономит время; jOOQ — когда SQL должен быть first-class. Миграции схемы всегда через тул (Flyway, Liquibase); никогда руками в prod.
Типичные ошибки
Ловушки JDBC и работа с БД: SQL-инъекция из конкатенации ("я же доверяю input" — пока не доверяете); утечки соединений (всегда try-with-resources или контейнер-managed); N+1 запросов от наивного Hibernate (eager-load явно через JOIN FETCH); медленный старт из-за Hibernate-metamodel + прогрев pool (прогревайте в CI/тестах).