Можно ли получить @@identity из вставки SQL при вызове шаблона Spring jdbc? Если да, то как?
идентификация из sql вставки через jdbctemplate
Ответы (4)
Метод JDBCTemplate.update
перегружен для получения объекта с именем GeneratedKeyHolder, который можно использовать для получения автоматически сгенерированного ключа. Например (код взят из здесь а>):
final String INSERT_SQL = "insert into my_test (name) values(?)";
final String name = "Rob";
KeyHolder keyHolder = new GeneratedKeyHolder();
jdbcTemplate.update(
new PreparedStatementCreator() {
public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
PreparedStatement ps =
connection.prepareStatement(INSERT_SQL, new String[] {"id"});
ps.setString(1, name);
return ps;
}
},
keyHolder);
// keyHolder.getKey() now contains the generated key
Как насчет SimpleJdbcInsert.executeAndReturnKey
? Он принимает две формы, в зависимости от ввода:
(1) Ввод Map
public java.lang.Number executeAndReturnKey(java.util.Map<java.lang.String,?> args)
Описание скопировано из интерфейса:
SimpleJdbcInsertOperations
Выполните вставку, используя переданные значения, и верните сгенерированный ключ. Для этого необходимо, чтобы были указаны имена столбцов с автоматически сгенерированными ключами. Этот метод всегда будет возвращать
KeyHolder
, но вызывающая сторона должна убедиться, что он действительно содержит сгенерированные ключи.Указано:
executeAndReturnKey
в интерфейсеSimpleJdbcInsertOperations
Параметры:
args - Map containing column names and corresponding value
Возвраты:
the generated key value
(2) Ввод SqlParameterSource
public java.lang.Number executeAndReturnKey(
SqlParameterSource
< /а>parameterSource)
Описание скопировано из интерфейса:
SimpleJdbcInsertOperations
Выполните вставку, используя переданные значения, и верните сгенерированный ключ. Для этого необходимо, чтобы были указаны имена столбцов с автоматически сгенерированными ключами. Этот метод всегда будет возвращать
KeyHolder
, но вызывающая сторона должна убедиться, что он действительно содержит сгенерированные ключи.Указано:
executeAndReturnKey
в интерфейсеSimpleJdbcInsertOperations
Параметры:
parameterSource - SqlParameterSource containing values to use for insert
Возвраты:
сгенерированное значение ключа.
Добавление подробных примечаний/образца кода в ответ todd.pierzina
jdbcInsert = new SimpleJdbcInsert(jdbcTemplate);
jdbcInsert.withTableName("TABLE_NAME").usingGeneratedKeyColumns(
"Primary_key");
Map<String, Object> parameters = new HashMap<>();
parameters.put("Column_NAME1", bean.getval1());
parameters.put("Column_NAME2", bean.getval2());
// execute insert
Number key = jdbcInsert.executeAndReturnKey(new MapSqlParameterSource(
parameters));
// convert Number to Int using ((Number) key).intValue()
return ((Number) key).intValue();
Я не знаю, есть ли "однострочник", но, похоже, это помогает (по крайней мере, для MSSQL):
// -- call this after the insert query...
this._jdbcTemplate.queryForInt( "select @@identity" );
Достойная статья здесь.