Spring Framework JDBC позволяет реализовать любое взаимодействие с РСУБД при помощи JdbcOperations и его реализаций, однако это предполагает написание SQL-запросов. Но для наиболее типовых ситуаций Spring Framework JDBC предоставляет интерфейсы и классы, ориентированные на конкретные операции, позволяющие в отдельных случаях обходиться без написания SQL-кода. В этой статье речь пойдёт об интерфейсе SimpleJdbcInsertOperations и его реалилизациях, позволяющих реализовать вставку записей в таблицы без SQL-кода.
Конфигурация проекта
Для использования Spring Framework JDBC требуется только соответствующая зависимость: org.springframework:spring-jdbc или org.springframework.boot:spring-boot-starter-jdbc, если используется Spring Boot:
Для примеров кода в этой статье будет использоваться класс Todo, имеющий следующую структуру:
для которого в базе данных существует таблица со следующей структурой:
Создание и конфигурирование объекта SimpleJdbcInsert
Конструктор SimpleJdbcInsert принимает один аргумент, это может быть объект класса javax.sql.DataSource или org.springframework.jdbc.core.JdbcTemplate. Для выполнения запросов SimpleJdbcInsert использует именно JdbcTemplate.
Созданный объект класса SimpleJdbcInsert можно сконфигурировать следующими методами:
- withTableName — для указания используемой таблицы
- withCatalogName — для указания используемого каталога
- withSchemaName — для указания используемой схемы
- withoutTableColumnMetaDataAccess — для отключения обработки метаданных
- usingColumns — для указания списка используемых колонок
- usingGeneratedKeyColumns — для указания списка колонок с генерируемыми значениями
При помощи этих методов мы можем сконфигурировать объект SimpleJdbcInsert таким образом, чтобы, например, в запрос передавались значения колонок id, done и task, а значение колонки date_created создавалось автоматически и возвращалось в ответе:
При этом создавать объект класса SimpleJdbcInsert для каждого вызова излишне. Гораздо правильнее будет создать один объект и использовать его повторно. Первый вариант — сконфигурировать компонент класса SimpleJdbcInsert в контексте приложения:
Второй вариант — создать новый класс и использовать его экземпляр:
После окончания конфигурирования можно вызвать метод compile, объявленный в org.springframework.jdbc.core.simple.AbstractJdbcInsert. Вызов этого метода предотвратит дальнейшее изменение объекта и подготовит его для выполнения запросов. Вызов этого метода опционален, так как он вызывается автоматически при запросе, если ещё не вызывался.
Выполнение запросов
Для выполнения запросов в интерфейсе SimpleJdbcInsertOperations объявлены 4 метода: execute, executeAndReturnKey, executeAndReturnKeyHolder и executeBatch.
execute
Самый простой метод, принимает в качества аргумента объект типа java.util.Map или org.springframework.jdbc.core.namedparam.SqlParameterSource, содержащий сохраняемые значения, и возвращает количество вставленных строк.
executeAndReturnKey
Принимает объект типа Map или SqlParameterSource в качестве аргумента и возвращает сгенерированный ключ. Данный метод применяется для получения сгенерированного значения в автоинкрементируемой колонке. Данный метод предполагает, что при конфигурировании объекта SimpleJdbcInsertOperations были указаны колонки с генерируемым значением.
executeAndReturnKeyHolder
Принимает объект типа Map или SqlParameterSource в качестве аргумента и возвращает сгенерированные ключи. Данный метод так же предполагает, что при конфигурировании объекта SimpleJdbcInsertOperations были указаны колонки с генерируемым значением. Возвращённый объект типа org.springframework.jdbc.support.KeyHolder содержит все автоматически сгенерированные зачения, среди которых могут быть не только целочисленные, но и, например, временные метки, как это было показано в одном из сниппетов.
executeBatch
Этот метод аналогичен execute, но ориентирован на выполнение сразу нескольких запросов. В качестве аргумента он принимает набор объектов Map или SqlParameterSource, содержащих значения колонок новых строк, и возвращает массив количества вставленных строк.
Полезные ссылки
Раздел официальной документации, посвящённый SimpleJdbcInsert.