平时做技术实践时,很多问题不是概念不会,而是细节没串起来。拿“Oracle、Mysql数据库中的insertOrUpdateBatch……”来说,它看着像小点,放到项目里常会牵出环境、配置、兼容性和维护成本。下面按实际采用顺序,把思路、关键写法和容易踩坑的地方讲清楚,便于大家直接对照操作。
实际处理时,Oracle 数据库 和 Mysql 数据库 中的SQL 存在不同的方言,在写SQL时需留意区分
1. Orecal 数据库
Orecal 数据库的 insertOrUpdateBatch 是用 mege into 类实现的
// merge into 语法 当数据存在时 更新数据, 不能更新 指定主键字段 (判断数据是否存在的字段)
merge into QWPH_XN.SYS_AREA t1
using (select 'lkz001' as ID,'KD001' as P_ID from dual) t2
on ( t1.ID = t2.ID and t1.P_ID = t2.P_ID)
when matched then
update
set t1.AREA_NAME = 'lkz0016666666666666666666'
when not matched then
insert (ID,P_ID)
values ('lkz002','KD001' );
// **** dual是一张临时表,也可以自己构建,例如:
merge into QWPH_XN.SYS_AREA t1
using DUAL
on ( t1.ID= 'lkz003')
when matched then
update
set t1.AREA_NAME = 'KEDONG'
when not matched then
insert (ID,P_ID)
values ('lkz003','KD003' );
merge into ${model}.SYS_AREA t1 using dual on (t1.ID = #{entity.id} and t1.P_ID = #{entity.pId})
when matched then
update
AREA_NAME = #{entity.areaName},
DTYPE = #{entity.dtype},
LEVEL = #{entity.level},
DATASOURCE_ID = #{entity.datasourceId},
when not matched then
insert (ID, AREA_NAME, P_ID, DTYPE, "LEVEL", DATASOURCE_ID)
values (#{entity.id}, #{entity.areaName},#{entity.pId},
#{entity.level},#{entity.dtype},#{entity.datasourceId})
2. Mysql 数据库
Orecal 数据库 和 Mysql 数据库的 插入或更新 sql 语句 不一样
inSert intO TASK LOG(TASK_ID, TASK_NAME, EXEC TYPE, STATUS, EXEC_TIME, EXCEPTION_MESSAGE)
values
(#lentity,taskId}, #entity.taskName}, #lentity.execType}, #ientity,status}, #entity.execTime}, #lentity.exceptionMessage})
on duplicate key update
TASK ID = ValUeS(TASK ID)
TASK NAME = VLUeS(TASK NAME)
EXEC TYPE = ValUeS(EXEC_TYPE)
STATUS = valveS(STATUS).
EXEC TIME = VlveS(EXEC TIME)
EXCEPTION_MESSAGE = VaLUeS(EXCEPTION_MESSAGE)
总结
理解这一步时,总的来说,oracle mysql适合结合实际项目边做边理解。先抓住核心思路,再逐步补上细节和边界处理,最后效果会更稳定,也更容易复用。

