java - query - spring jdbctemplate configuration
identidad desde la inserción de sql a través de jdbctemplate (4)
¿Es posible obtener la identidad @@ de la inserción de SQL en una llamada de plantilla Spring jdbc? ¿Si es así, cómo?
¿Qué tal SimpleJdbcInsert.executeAndReturnKey ? Toma dos formas, dependiendo de la entrada:
(1) La entrada es un Map
public java.lang.Number executeAndReturnKey(java.util.Map<java.lang.String,?> args)Descripción copiada de la interfaz:
SimpleJdbcInsertOperationsEjecute la inserción usando los valores pasados y devuelva la clave generada. Esto requiere que se haya especificado el nombre de las columnas con claves generadas automáticamente. Este método siempre devolverá un
KeyHolderpero el que llama debe verificar que realmente contiene las claves generadas.Especificado por:
SimpleJdbcInsertOperations en la interfaz
SimpleJdbcInsertOperationsParámetros:
args - Map containing column names and corresponding valueDevoluciones:
the generated key value
(2) La entrada es un SqlParameterSource
public java.lang.Number executeAndReturnKey(SqlParameterSourceparameterSource)Descripción copiada de la interfaz:
SimpleJdbcInsertOperationsEjecute la inserción usando los valores pasados y devuelva la clave generada. Esto requiere que se haya especificado el nombre de las columnas con claves generadas automáticamente. Este método siempre devolverá un
KeyHolderpero el que llama debe verificar que realmente contiene las claves generadas.Especificado por:
SimpleJdbcInsertOperations en la interfaz
SimpleJdbcInsertOperationsParámetros:
parameterSource - SqlParameterSource containing values to use for insertDevoluciones:
el valor clave generado.
Agregar notas detalladas / código de muestra a la respuesta todd.pierzina
jdbcInsert = new SimpleJdbcInsert(jdbcTemplate);
jdbcInsert.withTableName("TABLE_NAME").usingGeneratedKeyColumns(
"Primary_key");
Map<String, Object> parameters = new HashMap<String, Object>();
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();
No sé si hay un "one-liner", pero esto parece ser el truco (para MSSQL al menos):
// -- call this after the insert query...
this._jdbcTemplate.queryForInt( "select @@identity" );
Artículo decente here .
El método JDBCTemplate.update está sobrecargado para tomar un objeto llamado GeneratedKeyHolder que puede usar para recuperar la clave autogenerada. Por ejemplo (código tomado de here ):
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