9

Spring JDBCTemplate を使用していたときに非常によくある質問がありました。新しいデータ レコードをデータベースに挿入した後に ID 値を取得したいのですが、この ID 値は別の関連テーブルに参照されます。次の方法で挿入しようとしましたが、実際の一意の ID ではなく常に 1 を返します。(データベースはMySQLを使用しています)

public int insert(BasicModel entity) {
    String insertIntoSql = QueryUtil.getInsertIntoSqlStatement(entity);

    log.info("SQL Statement for inserting into: " + insertIntoSql);

    return this.jdbcTemplate.update(insertIntoSql);
}
4

3 に答える 3

10

JdbcTemplate.update()戻り値:

影響を受けた行数

これは常にステートメントです1INSERTさまざまなデータベースがさまざまな方法で生成されたキーの抽出をサポートしていますが、ほとんどの JDBC ドライバーはこれを抽象化し、これをJdbcTemplateサポートしています。引用12.2.8 自動生成された鍵の取得

簡易メソッドは、データベースによって生成されたupdate()主キーの取得をサポートしています。このサポートは、JDBC 3.0 標準の一部です。詳細については、仕様の第 13.6 章を参照してください。

基本的に、次のはるかに冗長なステートメントが必要です。

final String insertIntoSql = QueryUtil.getInsertIntoSqlStatement(entity);
KeyHolder keyHolder = new GeneratedKeyHolder();

jdbcTemplate.update(
  new PreparedStatementCreator() {
    public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
      return connection.prepareStatement(insertIntoSql, new String[] {"id"});
    }
  }, keyHolder);

return keyHolder.getKey().intValue();
于 2013-01-26T14:01:59.380 に答える
0

@panadol-chong さん、@tomasz-nurkiewicz さんのコードがここで機能するには、小さな変更が必要でした。

final String SQL = "INSERT INTO ... RETUNING id";

KeyHolder keyHolder = new GeneratedKeyHolder();

jdbcTemplate.update(connection -> {
    PreparedStatement ps = connection.prepareStatement(SQL, 
                           Statement.RETURN_GENERATED_KEYS);

    return ps;
}, keyHolder);

return keyHolder.getKey().intValue();

主な違いは、Statement.RETURN_GENERATED_KEYS.

于 2021-02-26T14:52:41.580 に答える