Как получить сгенерированный идентификатор после того, как я вставил новую запись данных в базу данных с помощью Spring JDBCTemplate?

Когда я использовал Spring JDBCTemplate, у меня возник очень распространенный вопрос: я хочу получить значение идентификатора после того, как я вставил новую запись данных в базу данных, это значение идентификатора будет относиться к другой связанной таблице. Я попытался вставить его следующим образом, но я всегда возвращаю 1, а не его реальный уникальный идентификатор. (Я использую MySQL в качестве базы данных)

public int insert(BasicModel entity) {
    String insertIntoSql = QueryUtil.getInsertIntoSqlStatement(entity);

    log.info("SQL Statement for inserting into: " + insertIntoSql);

    return this.jdbcTemplate.update(insertIntoSql);
}

person Brady Zhu    schedule 26.01.2013    source источник


Ответы (2)


JdbcTemplate.update()< /а> возвращает:

количество затронутых строк

Что всегда 1 для оператора INSERT. Различные базы данных поддерживают извлечение сгенерированного ключа по-разному, но большинство драйверов JDBC абстрагируются от этого, и JdbcTemplate поддерживает это. Цитирование 12.2.8 Получение автоматически сгенерированных ключей

Удобный метод update() поддерживает извлечение первичных ключей, сгенерированных базой данных. Эта поддержка является частью стандарта JDBC 3.0; подробности см. в главе 13.6 спецификации.

В основном вам нужно это гораздо более подробное утверждение:

final String insertIntoSql = QueryUtil.getInsertIntoSqlStatement(entity);
KeyHolder keyHolder = new GeneratedKeyHolder();

jdbcTemplate.update(
  new PreparedStatementCreator() {
    public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
      return connection.prepareStatement(insertIntoSql, new String[] {"id"});
    }
  }, keyHolder);

return keyHolder.getKey().intValue();
person Tomasz Nurkiewicz    schedule 26.01.2013
comment
Привет Томаш, я попробовал твой метод, но у меня не сработало. Я работаю над этим долгое время, но не могу найти решение. Пожалуйста, сообщите stackoverflow.com/questions/24567633/ - person Panadol Chong; 04.07.2014

@panadol-chong, для того, чтобы код @tomasz-nurkiewicz работал здесь, понадобилась небольшая модификация.

final String SQL = "INSERT INTO ... RETUNING id";

KeyHolder keyHolder = new GeneratedKeyHolder();

jdbcTemplate.update(connection -> {
    PreparedStatement ps = connection.prepareStatement(SQL, 
                           Statement.RETURN_GENERATED_KEYS);

    return ps;
}, keyHolder);

return keyHolder.getKey().intValue();

Основное отличие заключается в Statement.RETURN_GENERATED_KEYS.

person Cleber Angelo Capellari    schedule 26.02.2021