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:
SimpleJdbcInsertOperations
Ejecute 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
KeyHolder
pero el que llama debe verificar que realmente contiene las claves generadas.Especificado por:
SimpleJdbcInsertOperations en la interfaz
SimpleJdbcInsertOperations
Parámetros:
args - Map containing column names and corresponding value
Devoluciones:
the generated key value
(2) La entrada es un SqlParameterSource
public java.lang.Number executeAndReturnKey(
SqlParameterSource
parameterSource)
Descripción copiada de la interfaz:
SimpleJdbcInsertOperations
Ejecute 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
KeyHolder
pero el que llama debe verificar que realmente contiene las claves generadas.Especificado por:
SimpleJdbcInsertOperations en la interfaz
SimpleJdbcInsertOperations
Parámetros:
parameterSource - SqlParameterSource containing values to use for insert
Devoluciones:
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