61

是否可以从 Spring jdbc 模板调用的 SQL 插入中获取 @@identity?如果是这样,怎么做?

4

4 回答 4

99

JDBCTemplate.update方法被重载以获取一个名为 GeneratedKeyHolder 的对象,您可以使用它来检索自动生成的密钥。例如(取自此处的代码):

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?它有两种形式,具体取决于输入:

(1) 输入是Map

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

从接口复制的描述:SimpleJdbcInsertOperations

使用传入的值执行插入并返回生成的键。这要求已指定具有自动生成键的列的名称。此方法将始终返回 aKeyHolder但调用者必须验证它是否确实包含生成的密钥。

指定者:

executeAndReturnKey在界面中SimpleJdbcInsertOperations

参数:

args - Map containing column names and corresponding value

回报:

the generated key value

(2) 输入是SqlParameterSource

public java.lang.Number executeAndReturnKey(SqlParameterSourceparameterSource)

从接口复制的描述:SimpleJdbcInsertOperations

使用传入的值执行插入并返回生成的键。这要求已指定具有自动生成键的列的名称。此方法将始终返回 aKeyHolder但调用者必须验证它是否确实包含生成的密钥。

指定者:

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 回答