Java 通过jdbctemplate从sql insert获取标识

Java 通过jdbctemplate从sql insert获取标识,java,sql-server,spring,jdbc,jdbctemplate,Java,Sql Server,Spring,Jdbc,Jdbctemplate,是否可以在Spring jdbc模板调用中从SQL插入中获取@标识?如果是这样,怎么做?我不知道是否有“一行程序”,但这似乎起到了作用(至少对于MSSQL): 体面的文章。JDBCTemplate.update方法被重载,以获取一个名为GeneratedKeyHolder的对象,您可以使用该对象检索自动生成的密钥。例如(代码取自): 怎么样SimpleJdbcInsert.executeAndReturnKey?它有两种形式,具体取决于输入: public java.lang.Number ex

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

我不知道是否有“一行程序”,但这似乎起到了作用(至少对于MSSQL):


体面的文章。

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


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

public java.lang.Number executeAndReturnKey(java.util.Map args)

从接口复制的说明:

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

指定人:

接口内

参数:

args-包含列名和相应值的映射

返回:

生成的键值

public java.lang.Number executeAndReturnKey(
参数源)

从接口复制的说明:

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

指定人:

接口内

参数:

parameterSource-包含用于插入的值的SqlParameterSource

返回:

生成的键值


向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();
jdbinsert=newsimplejdbcinsert(jdbcTemplate);
jdbcInsert.withTableName(“TABLE_NAME”)。使用GeneratedKeyColumns(
“主键”);
映射参数=新的HashMap();
parameters.put(“Column_NAME1”,bean.getval1());
parameters.put(“Column_NAME2”,bean.getval2());
//执行插入
Number key=jdbciert.executeAndReturnKey(新的MapSqlParameterSource(
参数);
//使用((数字)键).intValue()将数字转换为Int
返回((数字)键).intValue();

这就是我在这里寻找的“一行”。美好的可悲的是,我看到了这个链接,但由于“JDBC3.0标准的一部分”而忽略了它。(我不认为我们使用JDBC 3.0,但我也不认为这与此相关)。它在Java 8中使用lambdas获得了一个真正的一行程序\m/如果生成的键不是一个数字,而是一个字符串呢?如果使用NEWID,这是一个哈希(字符串),您将如何返回它?KeyHolder不仅有getKey(),还有getKeys()和getKeyList()方法,将键值作为对象返回。哇,我真的不知道这个类-有点整洁。谢谢+1与PreparedStatementCreator版本相比,我更喜欢此版本。我面临此异常:org.springframework.dao.InvalidDataAccessResourceUsageException:此版本不支持getGeneratedKeys功能database@Az.MaYo-您的问题可能与JDBC驱动程序版本有关。找不到带有链接的页面。对于SQL Server,@@identity返回在当前会话中数据库中任何表上生成的最后一个id。例如,如果您的insert导致触发一个触发器,该触发器也会在某个表中生成一个新标识,那么您将获得该值。在大多数情况下,您永远不想使用@标识。
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
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();