Oracle 批量插入使得主键自增有很多实现方式,笔者使用的是较为简单的(序列)的方式,实现批量插入。但是有个问题,就是批量插入的同时获取每条插入数据的序列号。因为Oracle本身不像Mysql,是不支持批量返回主键id的,这也就是说,Mysql结合Mybatis的自动赋值主键的注解是无效的。当然,获取主键主要两种。
方式一: 先拿到主键,再批量插入。
方式二: 批量插入,再拿到主键。
笔者,所使用的是方式一,因为方式二我考虑使用触发器拿取,但是经过同事大佬点拨,大致意思是触发器很影响查询效率,相当于上锁,所以在这种情况下,实际业务不建议使用。方式一,我考虑就是先获取序列,放入到插入的集合中,再批量插入。但是这样有一个问题,就是需要频繁的与数据库交互,所以,如果大家有什么好的建议,可以提出来。
获取序列:
/** 获取序列
* @return
*/
Long getTaskSeq();
<select id="getTaskSeq" resultType="java.lang.Long">
SELECT TASK_ID_SEQ.NEXTVAL FROM dual
</select>
插入集合:
saveList.forEach(saveTaskDto -> {
Long taskSeq = userTaskDao.getTaskSeq();
saveTaskDto.setTaskId(taskSeq);
});
批量插入:
<insert id="insertBatchs" useGeneratedKeys="false" keyProperty="taskId">
BEGIN
<foreach collection="saveList" item="obj" separator="">
insert into
enterprise_user_task(task_id,enterprise_user_id,task_type,task_date,task_date_type,sys_create_date,sys_create_user)
values
(#{obj.taskId},#{obj.resourceUserId}, #{obj.taskType}, to_date(#{obj.taskDate}, 'yyyy-MM-dd'),#{obj.taskDateType}, #{obj.createDate},
#{obj.createUser});
</foreach>
COMMIT;
END;
</insert>
这样就可以在插入的同时,获取到批量插入的数据的序列。