id quadro da sql insert tramite jdbctemplate

È ansible ottenere l’id quadro @@ dall’inserto SQL su una chiamata modello jdbc Spring? Se é cosi, come?

Il metodo JDBCTemplate.update viene sovraccaricato per prendere un object chiamato GeneratedKeyHolder che è ansible utilizzare per recuperare la chiave generata automaticamente. Ad 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 

Che ne dici di SimpleJdbcInsert.executeAndReturnKey ? Prende due forms, a seconda dell’input:

(1) L’input è una Map

public java.lang.Number executeAndReturnKey(java.util.Map args)

Descrizione copiata dall’interfaccia: SimpleJdbcInsertOperations

Esegui l’inserimento usando i valori passati e restituisci la chiave generata. Ciò richiede che sia stato specificato il nome delle colonne con chiavi generate automaticamente. Questo metodo restituirà sempre una KeyHolder ma il chiamante deve verificare che contenga effettivamente le chiavi generate.

Specificato da:

executeAndReturnKey nell’interfaccia SimpleJdbcInsertOperations

parametri:

args - Map containing column names and corresponding value

Ritorna:

the generated key value

(2) L’input è una SqlParameterSource

public java.lang.Number executeAndReturnKey( SqlParameterSource parameterSource)

Descrizione copiata dall’interfaccia: SimpleJdbcInsertOperations

Esegui l’inserimento usando i valori passati e restituisci la chiave generata. Ciò richiede che sia stato specificato il nome delle colonne con chiavi generate automaticamente. Questo metodo restituirà sempre una KeyHolder ma il chiamante deve verificare che contenga effettivamente le chiavi generate.

Specificato da:

executeAndReturnKey nell’interfaccia SimpleJdbcInsertOperations

parametri:

parameterSource - SqlParameterSource containing values to use for insert

Ritorna:

il valore chiave generato.

Aggiunta di note dettagliate / codice di esempio alla risposta di todd.pierzina

 jdbcInsert = new SimpleJdbcInsert(jdbcTemplate); jdbcInsert.withTableName("TABLE_NAME").usingGeneratedKeyColumns( "Primary_key"); Map 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 c’è un “one-liner” ma questo sembra fare il trucco (almeno per MSSQL):

 // -- call this after the insert query... this._jdbcTemplate.queryForInt( "select @@identity" ); 

Articolo decente qui .