Mybatis批量插入到MySQL和Oracle

文章介绍了使用Mybatis在MySQL和Oracle数据库中进行批量插入的两种方法。对于MySQL,提供了直接插入和批量更新(如果不存在则插入)的方式,依赖于ONDUPLICATEKEYUPDATE语句。在Oracle中,批量插入通过INSERTALL和MERGE语句实现,同时处理了数据的更新和插入操作,基于WHENMATCHEDTHEN和WHENNOTMATCHEDTHEN条件。
摘要由CSDN通过智能技术生成

Mybatis批量插入到MySQL和Oracle

MySQL

方式一:直接插入

	<insert id="batchInsert">
		insert target_table(column_a, column_b) values
		<foreach item="item" index="index" collection="list" separator=",">
			(#{item.columnA},#{item.columnB})
		</foreach>
	</insert>

方式二:批量更新(如果不存在则插入)

    <insert id="batchUpdate">
        INSERT INTO
        target_table (column_a,column_b,column_c,column_key)
        VALUES
        <foreach item="item" index="index" collection="list" separator=",">
            (#{item.columnA},#{item.columnB},#{item.columnC},#{item.columnKey})
        </foreach>
        ON DUPLICATE KEY UPDATE
            column_a = VALUES(column_a),
            column_b = VALUES(column_b),
            column_c = VALUES(column_c),
            column_d = VALUES(columnKey)
    </insert>

说明:

  • 此方式是根据表target_table的主键进行判断,如果出现主键冲突则更新数据,主键不存在就插入数据,所以必须保证表有设置主键
  • 在上述的xml代码中列column_key可以视为主键
  • 如果是单条数据根据主键更新则直接去掉标签即可

Oracle

方式一:直接插入

	<insert id="batchInsert">
		insert all
		<foreach item="item" index="index" collection="list" separator=" ">
			into target_table(column_a, column_b) values (#{item.columnA},#{item.columnB})
		</foreach>
		select 1 from dual
	</insert>

注意:

  • foreach中的separator分隔符为" ";
  • 需要有select 1 from dual来使插入生效
  • 在某些情况下需要显式指定标签中的useGeneratedKeys=“false”

方式二:批量更新(如果不存在则插入)

  <insert id="batchUpdate" parameterType="EntityDemo">
      MERGE INTO target_table t
      USING (
		  <foreach item="item" index="index" collection="list" separator="union">
			  SELECT
				  #{item.id} id,
				  #{item.columnA} column_a,
				  #{item.columnB} column_b,
				  #{item.columnC} column_c,
				  sysdate column_date
			  FROM DUAL
		  </foreach>
      ) s
      ON (t.id = s.id)
      WHEN MATCHED THEN
      UPDATE SET
          t.column_a=s.column_a,
          t.column_b=s.column_b,
          t.column_c=s.column_c,
          t.column_date=s.column_date
      WHEN NOT MATCHED THEN
      INSERT (id,column_a,column_b,column_c,column_date)
      VALUES (s.id,s.column_a,s.column_b,s.column_c,s.column_date)
  </insert>

说明:

  • 标签中的separator分隔符为union

  • 此方法是通过target_table的id列来判断是否存在数据,如果存在则更新,如果不存在则插入,与MySQL不同这里是显式指定的

  • 此方法需要将待更新数据创建为一个临时表s,然后再将临时表中的数据更新到数据库或者插入到数据库

  • 此方法中可以不对属性进行判空,如果属性为空那么临时的字段对应为空,可以直接通过临时表数据写入数据库

  • ON判断条件中可以指定多个字段,通过AND连接多个判断条件

  • 插入时如果出现列类型不匹配的异常,可以在创建临时表时指定字段类型,例如:

    	SELECT
    		#{item.id,jdcType=VARCHAR} id,
    		#{item.columnA,jdcType=CHAR} column_a,
    		#{item.columnB,jdcType=DECIMAL} column_b,
    		#{item.columnC,jdcType=TIMESTAMP} column_c,
    		sysdate column_date
    	FROM DUAL
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值