最近需要将大量xml数据经过转换存在oracle数据库中,因为有大量的数据,所以采用批量操作,至于优点相信你在看的时候已经大概谅解了,具体操作我就分步骤说明一下,希望对你有帮助。
为了避免数据库字段过多给读者造成阅读负担,只在数据库中建立一个拥有一个主键和两个字段的表
一 ,批量插入如果主键重复主键不变根据主键更新,不重复的数据直接插入
表中数据
sql如下 :
<!-- 批量插入,重复更新,不重复直接插入 -->
<insert id="inserUser" parameterType="java.util.List">
merge into USERS T
USING (
<foreach
collection="list" item="li" index="index" separator="union">
select #{li.id} AS id,
#{li.name} AS name,
#{li.age} AS age
from dual
</foreach>) T1
ON (T1.id = T.id)
when matched then
update set T.name = T1.name,
T.age = T1.age
when not matched then
insert
(id, name, age)
values (T1.id,T1.name,T1.age)
</insert>
测试方法
执行结果分析,主键从5开始以前数据为中国,100。 现在插入日本,5条会被覆盖,没有的直接插入
二 ,批量插入不考虑主键重复,如果重复报主键冲突错误,否则全部插入。(我们项目采用这种方式,因为不考虑主键重复问题,使用的是oracle系统主键永远不会重复)
<!-- 批量插入,不考虑主键重复问题 -->
<insert id="inserUser1" parameterType="java.util.List" useGeneratedKeys="false">
INSERT INTO USERS ( id, name, age )
<foreach item="item" index="index" collection="list" separator="union all">
(SELECT #{item.id}, #{item.name}, #{item.age} FROM DUAL )
</foreach>
</insert>
三 ,单条数据主键重复的情况下,直接根据主键更新数据
原数据:
sql 语句:
<!-- 单条数据覆盖主键 -->
<insert id="inserUser2" parameterType="sinosoft.carship.entity.ErrInfo">
merge into USERS T
USING (
select #{id} AS id, #{name} AS name, #{age} AS age from dual) T1
ON (T1.id = T.id)
when matched then
update set T.name = T1.name, T.age = T1.age
when not matched then
insert (id, name, age) values (T1.id,T1.name,T1.age)
</insert>
测试类:
结果: