[oracle]oracle批量merge into来实现批量新增并在新增的同时更新满足条件的数据

注:使用批量插入或更新容易导致锁表,如果是读取频率很高的表还是不推荐使用
mysql版请参照此文章:https://blog.csdn.net/weixin_43303530/article/details/121536205

为了不影响程序性能,想要将一批数据批量加入到oracle,但是有些数据在新增的同时又需要判断是否存在与该数据用户账号和用户部门相同的数据,如果存在,就只对该数据进行更新,而不新增,如果不存在,就新增。

注:这里使用的持久层框架为ibatis

为了实现该功能,需要用到oracle的merge into语法:

注意:
  • 使用该语法时,无论是update还是insert后面都不需要加表名去声明,且insert后面也不需要加into,不然就会报错,缺少关键字:
    在这里插入图片描述

  • 在insert后面的所需增加的字段名也不需要采用:表名.字段名的形式,直接用小括号将字段名扩起来就可以了;

  • 在insert的时候values后面的值,一定要采用:表名.字段名的形式,否则会报列无效:
    在这里插入图片描述

  • 如果报错标识符无效,需要使用as起别名:
    在这里插入图片描述

  • 如果只有一条数据,迭代器迭代的时候conjunction属性为""并不会影响程序运行,但是数据在两条及两条以上,需要设置该属性为conjunction=“union”,否则会报错:
    在这里插入图片描述

完整Mapper映射:

Mapper.xml:

<statement id="insertSysDayClicks" parameterClass="java.util.List">
		merge into sys_day_click u
		using
		(
			<iterate conjunction="union">
				select #List[].usercode# as usercode,#List[].username# as username,#List[].usertype# as usertype,
				#List[].deptcode# as deptcode,#List[].stime# as stime,#List[].clickcount# as clickcount from dual
			</iterate>
		) t
		on (u.usercode = t.usercode and u.stime = t.stime and u.deptcode = t.deptcode)
		when matched then
			update set u.clickcount = t.clickcount
		when not matched then
			insert (usercode, username, usertype, deptcode, stime, clickcount) VALUES(t.usercode, t.username, t.usertype, t.deptcode, t.stime, t.clickcount)
	</statement>

Mapper.java:

@Override
public int insertSysDayClicks(List<HashMap> dayCountEntityList) {
	this.getSqlMapClientTemplate().queryForObject("insertSysDayClicks", dayCountEntityList);
	return Constants.CODE_DAO_SUCCESS;   //返回的状态值
}

该Mapper.xml的映射标签不可以写成insert,会报错:
在这里插入图片描述
如果需要使用insert标签,需要改写Mapper.java:

public int insertSysDayClicks(List<HashMap> dayCountEntityList) {
	this.getSqlMapClientTemplate().insert("insertSysDayClicks", dayCountEntityList);
	return Constants.CODE_DAO_SUCCESS;
}

参考博文:

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值