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

12

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

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

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

是否有另一种方法可以在不重构所有DAO的情况下获取插入的ID?


1
如果您正在使用NamedParameterJdbcTemplate,那么非常容易。请查看https://alvinalexander.com/blog/post/jdbc/spring-jdbc-insert-auto-generated-key。 - Eagle_Eye
2个回答

25

查看 NamedParameterJdbcTemplateJdbcTemplate 的文档,你有两个选择:

使用 NamedParameterJdbcTemplateupdate 方法。

使用JdbcTemplateupdate方法。

还有其他一些可用的方法,将键值填充到给定的 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) - Tobia
1
如果您选择NamedParameterJdbcTemplate,则必须创建SqlParameterSource,否则使用JdbcTemplate时,您必须使用PreparedStatementCreator。稍等一下,我会更新我的答案并给出一个例子。 - Paulius Matulionis
嗯...所以我必须重构所有的DAO...还有其他方法吗? - Tobia
1
春季文档陈述的是-是的,没有其他方法。 - Paulius Matulionis
这个示例代码中的语句是否会在每次调用时重新创建?例如,如果我有很多插入操作,我应该使用不同的 PreparedStatement 存储它们吗? - Tobia
显示剩余3条评论

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接