61

Is it possible to get the @@identity from the SQL insert on a Spring jdbc template call? If so, how?

4

4 に答える 4

99

この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
于 2009-11-03T16:14:38.460 に答える
52

どう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(SqlParameterSourceparameterSource)

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

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

指定者:

executeAndReturnKeyインターフェイスでSimpleJdbcInsertOperations

パラメーター:

parameterSource - SqlParameterSource containing values to use for insert

戻り値:

生成されたキー値。

于 2009-11-11T22:51:04.573 に答える
27

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();
于 2014-02-07T09:31:54.623 に答える
2

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

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

ここのまともな記事。

于 2009-11-03T08:15:55.223 に答える