web-dev-qa-db-ja.com

jdbctemplateを介したSQL挿入からのID

Spring jdbcテンプレート呼び出しのSQL挿入から@@ identityを取得することは可能ですか?もしそうなら、どのように?

54
javamonkey79

JDBCTemplate.updateメソッドはオーバーロードされ、GeneratedKeyHolderというオブジェクトを取得します。このオブジェクトを使用して、自動生成されたキーを取得できます。例( 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
89
Jason Gritman

_SimpleJdbcInsert.executeAndReturnKey_はどうですか?入力に応じて、2つの形式を取ります。

(1)入力はMap です

public Java.lang.Number executeAndReturnKey(Java.util.Map<Java.lang.String,?> args)

インターフェイスからコピーされた説明: SimpleJdbcInsertOperations

渡された値を使用して挿入を実行し、生成されたキーを返します。これには、自動生成キーを持つ列の名前が指定されている必要があります。このメソッドは常にKeyHolderを返しますが、呼び出し元は実際に生成されたキーが含まれていることを確認する必要があります。

指定者:

executeAndReturnKey インターフェイスで SimpleJdbcInsertOperations

パラメータ:

_args - Map containing column names and corresponding value_

戻り値:

_the generated key value_

(2)入力はSqlParameterSource です

_public Java.lang.Number executeAndReturnKey(_ SqlParameterSource _parameterSource)_

インターフェイスからコピーされた説明: SimpleJdbcInsertOperations

渡された値を使用して挿入を実行し、生成されたキーを返します。これには、自動生成キーを持つ列の名前が指定されている必要があります。このメソッドは常にKeyHolderを返しますが、呼び出し元は実際に生成されたキーが含まれていることを確認する必要があります。

指定者:

executeAndReturnKey インターフェイスで SimpleJdbcInsertOperations

パラメータ:

_parameterSource - SqlParameterSource containing values to use for insert_

戻り値:

生成されたキー値。

51
todd.pierzina

詳細なメモ/サンプルコードをtodd.pierzinaの回答に追加する

jdbcInsert = new SimpleJdbcInsert(jdbcTemplate);
        jdbcInsert.withTableName("TABLE_NAME").usingGeneratedKeyColumns(
                "Primary_key");
        Map<String, Object> parameters = new HashMap<>();
        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();
21

「ワンライナー」があるかどうかはわかりませんが、これでうまくいくようです(少なくともMSSQLの場合)。

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

まともな記事 こちら

1
javamonkey79