2009-11-03 15 views

Respuesta

65

El método JDBCTemplate.update está sobrecargado para tomar un objeto llamado GeneratedKeyHolder que puede usar para recuperar la clave autogenerada. Por ejemplo (tomado de código 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

Ese sería el "un trazador de líneas" que estoy buscando aquí. Bonito. Lo triste es que vi el enlace pero pasé por alto debido a esto: "parte del estándar JDBC 3.0". (No creo que usemos JDBC 3.0, pero tampoco creo que esto sea relevante). – javamonkey79

+1

Se obtiene un verdadero trazador de líneas en Java 8 con lambdas \ m/ – fabwu

3

No sé si hay un "one-liner", pero esto parece hacer el truco (por lo menos MSSQL):

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

artículo decente here.

+0

Página no encontrada con el enlace. – Ruslan

43

¿Qué tal SimpleJdbcInsert.executeAndReturnKey?

+2

Guau, realmente no sabía nada de esa clase, un poco ordenada. Gracias. +1 – javamonkey79

+0

Me gusta más esta versión que la versión con PreparedStatementCreator. – ruslanys

16

Adición de notas detalladas/código de ejemplo para responder a 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

Me enfrento a esta excepción: org.springframework.dao.InvalidDataAccessResourceUsageException: la función getGeneratedKeys no es compatible con esta base de datos –

+0

@ Az.MaYo - Su problema podría estar relacionado con la versión del controlador JDBC. –

Cuestiones relacionadas