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.*要远一点

CSDN 社区图书馆,开张营业! 深读计划,写书评领图书福利~

以上是关于mybatis和oracle结合实现批量插入的主要内容,如果未能解决你的问题,请参考以下文章

MyCat批量插入

Java通过Mybatis实现批量插入数据到Oracle中

Mybatis实现oracle批量插入及分页查询

Mybatis+Oracle --批量插入

如何向一个oracle表中快速插入很多条数据

mybatis使用oracle批量插入