Java 如何使用带有SpringJDBC的MERGE语句插入/更新单个记录
我有一个使用MERGE语句创建的update/insert SQL查询。使用JdbcTemplate或NamedParameterJdbcTemplate,Spring是否提供了一种方法,可以用来更新单个记录,而不是批量更新 由于此查询将用于通过JMS侦听器持久化队列中的数据,因此我一次只对一条记录进行排队,不需要批量更新的开销 如果批处理是通过SpringJDBC完成的唯一方法,那么这很好。。。我只是想确定我没有遗漏更简单的内容。您可以使用SQL语句,只使用包含参数的单行查询 例如,如果您有一个表company,其中包含IDA作为键,名称作为属性,则MERGE语句将是: 并入c公司 使用选择?身份证件来自双d的名称 在c.id=d.id上 匹配后再更新 设置c.name=d.name 如果不匹配,则插入c.id、c.name valuesd.id,d.name 如果目标表包含参数化键,则名称将更新,否则将插入新记录 使用JDBCTemplate,您可以使用该方法调用MERGEstatement,如下面使用Groovy脚本所示Java 如何使用带有SpringJDBC的MERGE语句插入/更新单个记录,java,sql,spring,jdbc,Java,Sql,Spring,Jdbc,我有一个使用MERGE语句创建的update/insert SQL查询。使用JdbcTemplate或NamedParameterJdbcTemplate,Spring是否提供了一种方法,可以用来更新单个记录,而不是批量更新 由于此查询将用于通过JMS侦听器持久化队列中的数据,因此我一次只对一条记录进行排队,不需要批量更新的开销 如果批处理是通过SpringJDBC完成的唯一方法,那么这很好。。。我只是想确定我没有遗漏更简单的内容。您可以使用SQL语句,只使用包含参数的单行查询 例如,如果您有一
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}"
只需使用其中一种更新方法,例如:而不是BatchUpdate。
Update更新单个记录,batchUpdate使用JDBC batch更新多个记录只需使用Update方法,例如,使用以下方法:而不是batchUpdate。更新更新单个记录,批更新使用JDBC批更新多个记录。@krokodiko:谢谢!这正是我需要知道的。你是第一个,所以如果你提供一个正式的答案,我将投票支持你的答案。每个人都乐于助人。我最初尝试了Spring的更新方法,但由于参数化列表存在问题,我错误地解释了异常,并确定更新不是正确的方法。我还没有意识到,使用SpringJDBC,它只是一个单一的或批处理的更新。我找了一个更具体的方法,但找不到,所以你的简短回答给了我解决问题所需的洞察力。谢谢你的回答!我使用了Java,但你的答案绝对正确。谢谢你分享这个例子。虽然我在SpringJDBC中使用更新方法已经很多年了,但我对合并语句还是新手,没有意识到更新方法的通用性足以处理更新和插入的SQL语句。实际上,我曾短暂地尝试过,但我的参数化列表有一个问题。在那之后,我正在寻找一个更具体的方法,可能是为执行合并而构建的。谢谢你的例子!