mybatis结合oracle实现数据的批量更新或者插入 merge into(批量数据中,如果有就更新 没有的话就插入)

业务场景:

子站给我们传的配置数据,包含新增的配置数据和修改的配置数据,两种数据混在一起,所以我现在要根据数据库中是否有某条配置数据来判断子站传过来的数据是新增还是修改。

首先创建oracle的序列,查询oracle的序列

select SEQUENCE_OWNER,SEQUENCE_NAME from dba_sequences where sequence_owner='用户名'; 

查找出来自己项目使用的序列,根据规则进行命名

DROP SEQUENCE SEQ_COAL_DEPARTMENT_LISTID;
CREATE SEQUENCE SEQ_COAL_DEPARTMENT_LISTID
INCREMENT BY 1
START WITH 1
MAXVALUE 1.0E20
MINVALUE 1
NOCYCLE
CACHE 20
NOORDER;

==============本来想的

我们的项目不能用网上说的方法生成ID,可能是mybatis的原因,这里就采用增加1次查一次吧

<select id="getCoalDepartmentId" resultType="java.lang.Long">
  	select SEQ_COAL_DEPARTMENT_LISTID.nextval from dual
  </select>

=============后来做的

使用merge into来做新增还是修改的逻辑判断,

如果按照平常的逻辑先查询数据库是否有这条配置数据 再根据查询的结果再增加,这样代码量也多,性能也不好,所以选择了这个

 <insert id="insertCoalDepartment" parameterType="java.util.List">
  
  	merge into IDS_COAL_DEPARTMENT_INFO_T t1
  		using
  		(
 			<foreach collection="list" item="item" index="index" separator="union">
				select
  				#{item.coalCode,jdbcType=VARCHAR} coalCode,#{item.teamType,jdbcType=BIGINT} teamType,
  				#{item.teamCode,jdbcType=VARCHAR} teamCode,#{item.teamName,jdbcType=VARCHAR} teamName,
  				#{item.workingStation,jdbcType=VARCHAR} workingStation,#{item.parentCode,jdbcType=VARCHAR} parentCode,
  				#{item.lastModify,jdbcType=BIGINT} lastModify
  				from dual
  			</foreach>
  		) t2
  		on (t1.COAL_CODE = t2.coalCode and t1.TEAM_CODE = t2.teamCode)
  		when matched then
  		update set
  		t1.TEAM_TYPE = t2.teamType,
  		t1.TEAM_NAME = t2.teamName,
  		t1.WORKING_STATION = t2.workingStation,
  		t1.PARENT_CODE = t2.parentCode,
  		t1.LAST_MODIFY = t2.lastModify
  		when not matched then
  		insert values(GET_SEQUENCE('SEQ_COAL_DEPARTMENT_LISTID'),t2.coalCode,t2.teamType,t2.teamCode,t2.teamName,t2.workingStation,t2.parentCode,t2.lastModify)
  </insert>

这里GET_SEQUENCE是写的一个函数,没想到能直接在insert方法里面使用

FUNCTION GET_SEQUENCE(in_seq_name VARCHAR2) RETURN NUMBER IS
next_val NUMBER;
BEGIN
	execute immediate 'SELECT '||in_sequence||'.nextval FROM dual' INTO next_val;
	RETURN next_val;
END;

 

创建触发器(题外话) 本来没找到如何在merge into 的insert逻辑怎么插入自增组件的方法,就想着采用触发器,每次插入数据的时候,再进行主键Id增加,但是后来发现,插入操作不传主键值的话会报错,就放弃了这种想法。

CREATE OR REPLACE TRIGGER dept_before_insert
BEFORE INSERT ON IDS_COAL_DEPARTMENT_INFO_T
FOR EACH ROW WHEN (NEW.ID IS NULL)
BEGIN
SELECT dept_seq.NEXTVAL INTO :NEW.ID FROM dual ;
END ;

具体性能还没有做测试,目前先这么做吧,看网上的代码写的乱七八糟,也是很烦,我这只是工作用,记录一下

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值