如何使用 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 在 SQL 查询中指定参数
如何使用 Spring 的 JDBCTemplate 有效地执行 IN() SQL 查询?