如何在Spring JDBC中使用MERGE语句插入/更新单个记录

时间:2018-08-06 16:03:43

标签: java sql spring jdbc

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

由于此查询将用于通过JMS侦听器保留队列中的数据,因此我一次仅使一个记录出队,而无需进行批处理更新。

如果批处理是通过Spring JDBC进行处理的唯一方法,那很好...我只是想确保我没有错过一些简单的事情。

2 个答案:

答案 0 :(得分:1)

您只能使用包含参数的单行查询来使用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)

如果目标表包含参数化键,则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}" 

答案 1 :(得分:1)

只需使用Range("A9:BF9").AutoFilter field:=55, Criteria1:=">0", Operator:=xlAnd, Criteria2:="<0" 方法之一,例如,使用以下方法之一:JdbcTemplate#update而不是BatchUpdate。
update更新一条记录,Update使用JDBC批处理更新多条记录