mybatis和oracle结合实现批量插入
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis和oracle结合实现批量插入相关的知识,希望对你有一定的参考价值。
参考技术A 看见同事写的for循环,内部调用insert方法,强迫症的我硬是把自己的逻辑实现改成batch insert。但是oracle的批量处理和mysql的不一样,oracle要创建一个自增序列。Mybatis中Oracle和Mysql批量插入的区别
前言
今天在开发功能的时候,在做批量插入的时候,怎么插入都报错,后来想了想自己现在在往Oracle中插入而不是MySQL,但是发现插入的时候区别还挺大的
区别
Mysql
<insert id="insertList" parameterType="java.util.List">
INSERT INTO
`t_user`
( `id`,`name`, `password`, `phone`, `email`, `create_time` )
VALUES
<foreach collection="list" item="item" index="index" separator=",">
(
(SELECT REPLACE(UUID(), '-', '') AS id),
#item.name,jdbcType=VARCHAR,
#item.password,jdbcType=VARCHAR,
#item.phone,jdbcType=VARCHAR,
#item.email,jdbcType=VARCHAR,
NOW()
)
</foreach>
</insert>
Oracle
主键使用序列
<insert id="saveSmartBannerInfoByKeyWord" parameterType="java.util.List">
INSERT INTO "MATCH_MANUAL"."SMART_BANNER_INFO" (
"ID",
"PROVIDERID",
"BANNERURL",
"CHECKED",
"SORTPOS",
"STATE",
"PUBDATE",
"WHOINPUT",
"IMGTYPE",
"KEYWORD",
"SKIPURL",
"PSKID",
"VERSION"
)
select smart_banner_info_seq.nextval ID, s.*
from
(
<foreach collection="p4pSmartBannerVos" item="item" separator="UNION ALL">
select
#item.providerid as PROVIDERID,
#item.bannerurl as BANNERURL,
'0' as CHECKED,
#item.sortpos as SORTPOS,
'0' as STATE,
sysdate as PUBDATE,
#item.username as WHOINPUT,
'0' as IMGTYPE,
#item.keyword as KEYWORD,
#item.skipurl as SKIPURL,
#item.pskId as PSKID,
#item.version as VERSION
from dual
</foreach>
) s
</insert>
主键不使用序列
<!--批量插入-->
<insert id="insertBatch" parameterType="com.caihao.oracledemo1.entity.CopyEmp">
INSERT INTO copy_emp(empno,ename,job,mgr,hiredate,sal,comm,deptno)
<foreach collection="copyEmpList" item="copyEmp" separator="UNION ALL">
SELECT #copyEmp.empno,#copyEmp.ename,#copyEmp.job,#copyEmp.mgr,
#copyEmp.hiredate,#copyEmp.sal,#copyEmp.comm,#copyEmp.deptno
FROM dual
</foreach>
</insert>
对比
在m
ysql中直接values后面foreach即可。
1、在Oracle中如果有序列,就用上面写的,没有序列直接放在foreach中即可。
2、在Oracle中我上面有多个参数0,这时候我们需要给这些参数起个别名。
3、在Oracle中select s.* from 中from 和s.*要远一点
以上是关于mybatis和oracle结合实现批量插入的主要内容,如果未能解决你的问题,请参考以下文章