Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用带有SpringJDBC的MERGE语句插入/更新单个记录_Java_Sql_Spring_Jdbc - Fatal编程技术网

Java 如何使用带有SpringJDBC的MERGE语句插入/更新单个记录

Java 如何使用带有SpringJDBC的MERGE语句插入/更新单个记录,java,sql,spring,jdbc,Java,Sql,Spring,Jdbc,我有一个使用MERGE语句创建的update/insert SQL查询。使用JdbcTemplate或NamedParameterJdbcTemplate,Spring是否提供了一种方法,可以用来更新单个记录,而不是批量更新 由于此查询将用于通过JMS侦听器持久化队列中的数据,因此我一次只对一条记录进行排队,不需要批量更新的开销 如果批处理是通过SpringJDBC完成的唯一方法,那么这很好。。。我只是想确定我没有遗漏更简单的内容。您可以使用SQL语句,只使用包含参数的单行查询 例如,如果您有一

我有一个使用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脚本所示

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语句。实际上,我曾短暂地尝试过,但我的参数化列表有一个问题。在那之后,我正在寻找一个更具体的方法,可能是为执行合并而构建的。谢谢你的例子!