Рубрики
Без рубрики

Получение автоматически сгенерированных ключей в Spring JDBC

Краткое и практическое руководство по получению автоматически сгенерированных ключей при работе с Spring JDBC.

Автор оригинала: baeldung.

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) {
    Map parameters = 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 .