来自sql insert的身份通过jdbctemplate

时间:2009-11-03 07:52:05

标签: java sql-server spring jdbc jdbctemplate

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

4 个答案:

答案 0 :(得分:88)

重载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

答案 1 :(得分:51)

SimpleJdbcInsert.executeAndReturnKey怎么样?它有两种形式,具体取决于输入:

(1) The input is a 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) The input is a SqlParameterSource

  

public java.lang.Number executeAndReturnKey( SqlParameterSource parameterSource)

     

从界面复制的说明:SimpleJdbcInsertOperations

     

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

     

指定者:

     接口executeAndReturnKey

中的

SimpleJdbcInsertOperations      

<强>参数:

     

parameterSource - SqlParameterSource containing values to use for insert

     

<强>返回:

     

生成的键值。

答案 2 :(得分:21)

将详细说明/示例代码添加到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();

答案 3 :(得分:1)

我不知道是否有“单行”,但这似乎可以解决问题(对于MSSQL至少):

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

体面的文章here