如何使用 Spring Jdbctemplate.update(String sql, obj...args) 获取插入的 id

Posted

技术标签:

【中文标题】如何使用 Spring Jdbctemplate.update(String sql, obj...args) 获取插入的 id【英文标题】:How to get inserted id using Spring Jdbctemplate.update(String sql, obj...args) 【发布时间】:2016-05-07 10:42:01 【问题描述】:

我正在使用 Jdbctemplate,我需要插入的查询 id。 我读到我必须构建一个特定的 PreparedStatement 并使用 GeneratedKeyHolder 对象。

问题是在我的应用程序中所有插入方法都使用了这个 JdbcTemplate 更新方法:

getJdbcTemplate().update(SQL_INSERT,param1,param2,param3,...);

有没有其他方法可以在不重构所有 daos 的情况下获取插入的 id?

【问题讨论】:

如果您使用的是 NamedParameterJdbcTemplate,那么这很容易。检查alvinalexander.com/blog/post/jdbc/…。 【参考方案1】:

查看NamedParameterJdbcTemplate 和JdbcTemplate 的文档,您有两个选择:

使用NamedParameterJdbcTemplate的update方法。

使用JdbcTemplate的update方法。

还有一些其他可用的方法可以填充给定GeneratedKeyHolder 的密钥,这取决于您自己的需求。

编辑

例如使用 JdbcTemplate:

GeneratedKeyHolder holder = new GeneratedKeyHolder();
jdbcTemplate.update(new PreparedStatementCreator() 
    @Override
    public PreparedStatement createPreparedStatement(Connection con) throws SQLException 
        PreparedStatement statement = con.prepareStatement("INSERT INTO SOME_TABLE(NAME, VALUE) VALUES (?, ?) ", Statement.RETURN_GENERATED_KEYS);
        statement.setString(1, "SomeName");
        statement.setString(2, "SomeValue");
        return statement;
    
, holder);

long primaryKey = holder.getKey().longValue();

【讨论】:

好的,但是如何包装现有代码? (param1,param2,param3...args) 如果您选择 NamedParameterJdbcTemplate,您必须创建 SqlParameterSource,否则对于 JdbcTemplate,您必须使用 PreparedStatementCreator。给我一秒钟,我会更新我的答案,举个例子。 MMh...所以我必须重构所有 daos... 现在换个方式? Spring 文档说明了什么 - 是的,没有其他办法。 是否为每次调用重新创建了包含此示例代码的语句?例如,如果我有很多插入,我应该使用不同的存储 PreparedStatement 吗?【参考方案2】:

这不适用于 PostgreSQL,持有者返回所有属性。这是PostgreSQL中解决方案的链接Spring: How to use KeyHolder with PostgreSQL

【讨论】:

以上是关于如何使用 Spring Jdbctemplate.update(String sql, obj...args) 获取插入的 id的主要内容,如果未能解决你的问题,请参考以下文章

如何使用Spring JdbcTemplate截断表?

如何使用 Spring 的 JdbcTemplate 重用相同的连接?

如何使用 spring 的 jdbcTemplate 在 SQL 查询中指定参数

如何使用 Spring 的 JDBCTemplate 有效地执行 IN() SQL 查询?

如何使用 Spring 的 JdbcTemplate 连接一个简单的 MySql 数据库?

如何执行 IN() 和 WHERE=?使用 Spring 的 JDBCTemplate 进行 SQL 查询