1. введение
В этом кратком руководстве мы рассмотрим возможность получения автоматически сгенерированного ключа после вставки сущностей при работе с Spring JDBC .
2. Зависимости Maven
Сначала нам нужно, чтобы spring-boot-starter-jdbc и H2 зависимости были определены в вашем pom.xml :
org.springframework.boot spring-boot-starter-jdbc com.h2database h2 runtime
Мы можем проверить последнюю версию этих двух зависимостей на Maven Central: spring-boot-starter-jdbc и h2 .
3. Получение Автоматически сгенерированного ключа
3.1. Сценарий
Давайте определим таблицу sys_message , которая имеет 2 столбца: id (автоматически сгенерированный ключ) и сообщение :
CREATE TABLE IF NOT EXISTS sys_message ( id bigint(20) NOT NULL AUTO_INCREMENT, message varchar(100) NOT NULL, PRIMARY KEY (id) );
3.2. Использование JdbcTemplate
Теперь давайте реализуем метод, который будет использовать JdbcTemplate для вставки новой записи и возврата автоматически сгенерированного id.
Поэтому мы будем использовать метод JdbcTemplate | update () , который поддерживает извлечение первичных ключей, сгенерированных базой данных. Этот метод принимает экземпляр интерфейса Preparedstatementcreator в качестве первого аргумента, а другим аргументом является Держатель ключа.
Поскольку интерфейс PrepareStatementCreator является функциональным интерфейсом , где его метод принимает экземпляр java.sql.Connection и возвращает объект java.sql.PreparedStatement , для простоты мы можем использовать лямбда-выражение:
String INSERT_MESSAGE_SQL = "insert into sys_message (message) values(?) "; public long insertMessage(String message) { KeyHolder keyHolder = new GeneratedKeyHolder(); jdbcTemplate.update(connection -> { PreparedStatement ps = connection .prepareStatement(INSERT_MESSAGE_SQL); ps.setString(1, message); return ps; }, keyHolder); return (long) keyHolder.getKey(); } }
Стоит отметить, что объект keyHolder будет содержать автоматически сгенерированный ключ, возвращаемый методом JdbcTemplate update () .
Мы можем получить этот ключ, вызвав keyHolder.getKey().
Кроме того, мы можем проверить метод:
@Test public void insertJDBC_whenLoadMessageByKey_thenGetTheSameMessage() { long key = messageRepositoryJDBCTemplate.insert(MESSAGE_CONTENT); String loadedMessage = messageRepositoryJDBCTemplate .getMessageById(key); assertEquals(MESSAGE_CONTENT, loadedMessage); }
3.3. Использование SimpleJdbcInsert
В дополнение к JdbcTemplate мы также можем использовать SimpleJdbcInsert для достижения того же результата.
Следовательно, нам нужно инициализировать экземпляр SimpleJdbcInsert :
@Repository public class MessageRepositorySimpleJDBCInsert { SimpleJdbcInsert simpleJdbcInsert; @Autowired public MessageRepositorySimpleJDBCInsert(DataSource dataSource) { simpleJdbcInsert = new SimpleJdbcInsert(dataSource) .withTableName("sys_message").usingGeneratedKeyColumns("id"); } //... }
Следовательно, мы можем вызвать executeAndReturnKey метод SimpleJdbcInsert , чтобы вставить новую запись в sys_message таблицу и получить обратно автоматически сгенерированный ключ :
public long insert(String message) { Mapparameters = new HashMap<>(1); parameters.put("message", message); Number newId = simpleJdbcInsert.executeAndReturnKey(parameters); return (long) newId; }
Кроме того, мы можем проверить этот метод довольно просто:
@Test public void insertSimpleInsert_whenLoadMessageKey_thenGetTheSameMessage() { long key = messageRepositorySimpleJDBCInsert.insert(MESSAGE_CONTENT); String loadedMessage = messageRepositoryJDBCTemplate.getMessageById(key); assertEquals(MESSAGE_CONTENT, loadedMessage); }
4. Заключение
Мы изучили возможность использования JdbcTemplate и SimpleJdbcInsert для вставки новой записи и возврата автоматически сгенерированного ключа.
Как всегда, мы можем найти реализацию этой статьи на Github .