template query ejemplos consulta baeldung java sql-server spring jdbc jdbctemplate

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