2009-11-03 25 views

答えて

65

JDBCTemplate.updateメソッドは、自動生成されたキーを取得するために使用できるGeneratedKeyHolderというオブジェクトを取得するためにオーバーロードされます。例えば(hereから取られたコード):SimpleJdbcInsert.executeAndReturnKeyについて

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

それは私がここで探している "1つのライナー"になります。ニース。悲しいことに、私はリンクを見ていましたが、これによってこれを過ぎて光沢を帯びました: "JDBC 3.0標準の一部"。 (私はJDBC 3.0を使用しているとは思わないが、これも関係ないと思う)。 – javamonkey79

+1

ラムダ\ n/ – fabwu

3

「ワンライナー」がある場合、私は知らないが、これは(少なくともMSSQLのための)トリックを行うようだ:

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

まともな記事here

+0

ページに答えるために詳細なメモ/サンプルコードを追加します。 – Ruslan

43

どのように?

+2

でJava 8の本物のライナーを手に入れました。うわー、そのクラスについては本当に分かりませんでした。ありがとう。 +1 – javamonkey79

+0

私はこのバージョンがPreparedStatementCreatorのバージョンよりも好きです。 – ruslanys

16

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

私はこの例外に直面しています: org.springframework.dao.InvalidDataAccessResourceUsageException:このデータベースではgetGeneratedKeys機能がサポートされていません –

+0

@ Az.MaYo - あなたの問題はJDBCドライバのバージョンに関連する可能性があります。 –