identità dal inserto di sql via jdbctemplate
-
13-09-2019 - |
Domanda
E 'possibile ottenere il @@ identità dal inserto SQL su un modello di chiamata Spring JDBC? Se sì, come?
Soluzione
Il metodo JDBCTemplate.update
è sovraccarico di prendere un oggetto chiamato un GeneratedKeyHolder che è possibile utilizzare per recuperare la chiave generata automaticamente. Per esempio (codice preso da qui ):
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
Altri suggerimenti
Come su SimpleJdbcInsert.executeAndReturnKey
? Ci vogliono due forme, a seconda dell'ingresso:
(1) L'ingresso è un Map
public java.lang.Number executeAndReturnKey(java.util.Map<java.lang.String,?> args)
Descrizione copiato da interfaccia:
SimpleJdbcInsertOperations
Esegui l'inserto utilizzando i valori passati e restituire la chiave generata. Ciò richiede che il nome delle colonne con le chiavi di auto generato è stato specificato. Questo metodo restituirà sempre un
KeyHolder
ma il chiamante deve verificare che in realtà contiene le chiavi generate.Specified by:
executeAndReturnKey
interfacciaSimpleJdbcInsertOperations
Parametri:
args - Map containing column names and corresponding value
Returns:
the generated key value
(2) L'ingresso è un SqlParameterSource
public java.lang.Number executeAndReturnKey(
SqlParameterSource
parameterSource)
Descrizione copiato da interfaccia:
SimpleJdbcInsertOperations
Esegui l'inserto utilizzando i valori passati e restituire la chiave generata. Ciò richiede che il nome delle colonne con le chiavi di auto generato è stato specificato. Questo metodo restituirà sempre un
KeyHolder
ma il chiamante deve verificare che in realtà contiene le chiavi generate.Specified by:
executeAndReturnKey
interfacciaSimpleJdbcInsertOperations
Parametri:
parameterSource - SqlParameterSource containing values to use for insert
Returns:
il valore della chiave generata.
L'aggiunta di note dettagliate / codice di esempio per rispondere 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();
Non so se v'è un "one-liner", ma questo sembra fare il trucco (per MSSQL almeno):
// -- call this after the insert query...
this._jdbcTemplate.queryForInt( "select @@identity" );
qui .