2009-11-03 8 views

Antwort

65

Die Methode JDBCTemplate.update ist überladen, um ein Objekt namens GeneratedKeyHolder zu übernehmen, mit dem Sie den automatisch generierten Schlüssel abrufen können. Zum Beispiel (Code aus here genommen):

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

Das wäre der "One Liner", den ich hier suche. Nett. Traurig ist, dass ich den Link gesehen habe, aber deswegen vorbeigeschaut habe: "Teil des JDBC 3.0-Standards". (Ich glaube nicht, dass wir JDBC 3.0 verwenden, aber ich denke auch nicht, dass das relevant ist). – javamonkey79

+1

Es bekommt einen echten Liner in Java 8 mit Lambdas \ m/ – fabwu

3

Ich weiß nicht, ob es ein "one-liner", aber dies scheint den Trick (für MSSQL mindestens) zu tun:

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

Decent Artikel here.

+0

Seite nicht mit der Verbindung gefunden. – Ruslan

43

Wie wäre es SimpleJdbcInsert.executeAndReturnKey?

+2

Wow, ich wusste nicht wirklich über diese Klasse - irgendwie ordentlich. Vielen Dank. +1 – javamonkey79

+0

Ich mag diese Version mehr als Version mit PreparedStatementCreator. – ruslanys

16

Hinzufügen detaillierte Notizen/Beispielcode todd.pierzina beantworten

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

Ich stehe vor dieser Ausnahme: org.springframework.dao.InvalidDataAccessResourceUsageException: Die Funktion getGeneratedKeys wird von dieser Datenbank nicht unterstützt –

+0

@ Az.MaYo - Ihr Problem könnte mit der JDBC-Treiberversion zusammenhängen. –