2009-11-03 16 views

Odpowiedz

65

Metoda JDBCTemplate.update jest przeciążona, aby pobrać obiekt o nazwie GeneratedKeyHolder, za pomocą którego można pobrać wygenerowany automatycznie klucz. Na przykład (kod pochodzi z 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

To byłby "jeden liniowiec", którego tutaj szukam. Miły. Smutne jest to, że zobaczyłem link, ale pominąłem go z powodu tego: "część standardu JDBC 3.0". (Nie sądzę, że używamy JDBC 3.0, ale nie sądzę, że jest to istotne). – javamonkey79

+1

Staje się prawdziwą liner w Java 8 z lambdas \ m/ – fabwu

3

Nie wiem, czy jest "one-liner", ale wydaje się to rade (dla MSSQL co najmniej):

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

Godna artykuł here.

+0

Nie znaleziono strony z linkiem. – Ruslan

43

Jak o SimpleJdbcInsert.executeAndReturnKey?

+2

Wow, tak naprawdę nie wiedziałem o tej klasie - w porządku. Dzięki. +1 – javamonkey79

+0

Podoba mi się ta wersja więcej niż wersja z PreparedStatementCreator. – ruslanys

16

Dodawanie szczegółowe notatki/przykładowy kod do todd.pierzina odpowiedzieć

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

Mam do czynienia z tym wyjątkiem: org.springframework.dao.InvalidDataAccessResourceUsageException: Funkcja getGeneratedKeys nie jest obsługiwana przez tę bazę danych –

+0

@ Az.MaYo - Problem może dotyczyć wersji sterownika JDBC. –

Powiązane problemy