Oracle+Mybatis-Plus 的批量插入


Oracle的批量处理和MySQL不一样,记录踩过的坑。

1 首先是Mybatis-Plus自带的批量插入:

saveBatch方法: 它的SQL 如图所示:

 2 是利用存储过程实现批量插入的形式

Mapper 方法:
 int insertBatch(List<TabUser> list);

XML:
 <insert id="insertBatch" parameterType="java.util.List" >
        begin
        <foreach collection="list" item="item" index="index">
            insert into tab_user
            (
           id, name,age,email
            )
            values(
            #{item.id,jdbcType=DECIMAL},
            #{item.name,jdbcType=VARCHAR},
#{item.age,jdbcType=DECIMAL},
#{item.email,jdbcType=VARCHAR} );
foreach> end; insert>

SQL语句是拼接起来的:

 相当于如下形式: 

 3  第三种方式:利用标签,将入参的list集合通过UNION ALL生成虚拟数据,从而实现批量插入(

Mapper: 
  int insertByForeach(List<TabUser> list);
XML:
<insert id="insertByForeach"> insert into tab_user ( id,name,age,email) select A.* from ( <foreach collection="list" item="item" index="index" separator="UNION ALL"> select #{item.id,jdbcType=DECIMAL}, #{item.name,jdbcType=VARCHAR}, #{item.age,jdbcType=DECIMAL},#{item.email,jdbcType=VARCHAR} from dual foreach> ) A insert>

SQL语句是union all 拼接起来的: 

运行结果:

 相当于如下形式: 

 4 使用特殊的sql语句 形式如下:

Mapper:
int insertOneSql(List<TabUser> list);
XML:

 <insert id="insertOneSql">
        insert all
        <foreach collection="list" item="item" index="index">
            into tab_user(id,name,age,email) 
            values(
            #{item.id,jdbcType=DECIMAL}, #{item.name,jdbcType=VARCHAR},
            #{item.age,jdbcType=DECIMAL},#{item.email,jdbcType=VARCHAR}
            )
        foreach>
        select 1 from dual
    insert>

运行结果: