2009-11-03 3 views

Répondre

65

La méthode JDBCTemplate.update est surchargée pour prendre un objet appelé GeneratedKeyHolder que vous pouvez utiliser pour récupérer la clé générée automatiquement. Par exemple (code tiré 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 
+0

Ce serait le "one liner" que je cherche ici. Agréable. Triste chose est que j'ai vu le lien, mais je l'ai passé à côté de cela: "partie de la norme JDBC 3.0". (Je ne pense pas que nous utilisions JDBC 3.0, mais je ne pense pas non plus que cela soit pertinent). – javamonkey79

+1

Il obtient un vrai one liner en Java 8 avec lambdas \ m/ – fabwu

3

Je ne sais pas s'il y a un "one-liner", mais cela semble faire l'affaire (pour MSSQL au moins):

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

article décent here.

+0

Page non trouvée avec le lien. – Ruslan

43

Que diriez-vous SimpleJdbcInsert.executeAndReturnKey?

+2

Wow, je ne savais pas vraiment à propos de cette classe - un peu soigné. Merci. +1 – javamonkey79

+0

J'aime cette version plus que la version avec PreparedStatementCreator. – ruslanys

16

Ajout de notes détaillées/exemple de code pour répondre à 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(); 
+0

Je suis confronté à cette exception: org.springframework.dao.InvalidDataAccessResourceUsageException: La fonction getGeneratedKeys n'est pas supportée par cette base de données –

+0

@ Az.MaYo - Votre problème peut être lié à la version du pilote JDBC. –