java - 如何使用 Spring JDBC 的 MERGE 语句插入/更新单个记录

标签 java sql spring jdbc

我有一个使用 MERGE 语句创建的更新/插入 SQL 查询。使用 JdbcTemplate 或 NamedParameterJdbcTemplate,Spring 是否提供了一种可用于更新单个记录(而不是批量更新)的方法?

由于此查询将用于通过 JMS 监听器保存队列中的数据,因此我一次仅使一条记录出列,并且不需要批量更新的开销。

如果批处理是通过 Spring JDBC 完成此操作的唯一方法,那很好......我只是想确保我没有错过一些更简单的东西。

最佳答案

您可以使用 SQL MERGE仅使用包含参数的一行查询的语句。

例如,如果您有一个表 COMPANY,其中包含 ID 作为键,NAME 作为属性,则 MERGE声明将是:

merge into company c
using (select ? id, ? name from dual) d
on (c.id = d.id)
when matched then update 
   set c.name = d.name
when not matched then insert (c.id, c.name)
   values(d.id, d.name)

如果您的目标表包含参数化键,则名称将被更新,否则将插入一条新记录。

通过 JDBCTemplate,您可以使用 update方法来调用 MERGE 语句,如下所示(使用 Groovy 脚本)

def id = 1
def name = 'NewName'

String mergeStmt = """merge into company c
using (select ? id, ? name from dual) d
on (c.id = d.id)
when matched then update 
   set c.name = d.name
when not matched then insert (c.id, c.name)
   values(d.id, d.name)""";

def updCnt = jdbcTemplate.update(mergeStmt, id, name);

println "merging ${id}, name ${name}, merged rows ${updCnt}" 

关于java - 如何使用 Spring JDBC 的 MERGE 语句插入/更新单个记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51711617/

相关文章:

java - Java 并行流中的异常传播

java - Glassfish 5.1 服务器在启用安全管理后无法启动(NoClassDefFoundError : sun/security/ssl/HelloExtension)

c# - 为什么 sp_executesql 不返回结果而直接 SP 调用返回结果?

sql - 如何使用带有候选发布键的表编写查询?

java - 如何使用 Java Spring 实现自动登录?

java - 在最新的 Spring v4 中使用带有可选正文的 @RequestBody

java - JSP传递变量

java - java中的继承和数组列表

MYSQL 等效于 MS-Access 函数 first() last()

java - 如何在 Spring Batch 中使用 HibernateCursorItemReader