2009-11-03 17 views

risposta

65

Il metodo JDBCTemplate.update è sovraccarico per prendere un oggetto denominato GeneratedKeyHolder che è possibile utilizzare per recuperare la chiave generata automaticamente. Per esempio (codice tratto da 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 
+0

Quello sarebbe il "one liner" che sto cercando qui. Bello. La cosa triste è che ho visto il collegamento ma l'ho sorpassato a causa di questo: "parte dello standard JDBC 3.0". (Non penso che usiamo JDBC 3.0, ma non penso che questo sia rilevante). – javamonkey79

+1

Ottenendo un vero e proprio rivestimento in Java 8 con lambdas \ m/ – fabwu

3

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"); 

articolo decente here.

+0

Pagina non trovata con il link. – Ruslan

43

Come su SimpleJdbcInsert.executeAndReturnKey?

+2

Wow, non sapevo davvero di quella classe - un po 'pulito. Grazie. +1 – javamonkey79

+0

Mi piace questa versione più della versione con PreparedStatementCreator. – ruslanys

16

Aggiunta di note dettagliate/codice di esempio per todd.pierzina rispondere

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(); 
+0

Sono di fronte a questa eccezione: org.springframework.dao.InvalidDataAccessResourceUsageException: la funzione getGeneratedKeys non è supportata da questo database –

+0

@ Az.MaYo: il problema potrebbe essere correlato alla versione del driver JDBC. –

Problemi correlati