【Oracle数据库】批量插入数据,并避免数据重复插入,插入数据去重(mybatis)

本文介绍了如何使用Mybatis的mapper接口和XML文件,通过动态SQL实现批量插入数据时的去重功能。通过`<foreach>`和`UNION`操作,结合`notexists`条件,确保只有当指定字段值唯一时才插入记录。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

oracle 批量插入数据

mapper.java文件

    public int addBatch(@Param("viewList") List<_java映射类> list);

xml文件

  <insert id="addBatch" parameterType="map" useGeneratedKeys="false">
        INSERT INTO _表名 
            (_字段名1,_字段名2,_字段名3,_字段名4,_字段名5,_字段名6)
        SELECT _字段名1,_字段名2,_字段名3,_字段名4,_字段名5,_字段名6 FROM (
        <foreach collection="viewList" item="item" index="index" separator="UNION">
            <if test="index == 0">
                SELECT
                #{item._java类映射_字段名1,jdbcType=VARCHAR} as _字段名1,
                #{item._java类映射_字段名2,jdbcType=VARCHAR} as _字段名2,
                #{item._java类映射_字段名3,jdbcType=VARCHAR} as _字段名3,
                #{item._java类映射_字段名4,jdbcType=VARCHAR} as _字段名4,
                #{item._java类映射_字段名5,jdbcType=VARCHAR} as _字段名5,
                #{item._java类映射_字段名6,jdbcType=VARCHAR} as _字段名6
                from dual where not exists (
                    select 1 from _表名 where _字段名1 = #{item._java类映射_字段名1} and _字段名2 = #{item._java类映射_字段名2}
                        and _字段名3 = #{item._java类映射_字段名3} and _字段名4 = #{item._java类映射_字段名4})
            </if>
            <if test="index!=0">
                SELECT
                 #{item._java类映射_字段名1,jdbcType=VARCHAR} ,
                #{item._java类映射_字段名2,jdbcType=VARCHAR} ,
                #{item._java类映射_字段名3,jdbcType=VARCHAR} ,
                #{item._java类映射_字段名4,jdbcType=VARCHAR} ,
                #{item._java类映射_字段名5,jdbcType=VARCHAR} ,
                #{item._java类映射_字段名6,jdbcType=VARCHAR} 
                from dual where not exists (
               select 1 from _表名 where _字段名1 = #{item._java类映射_字段名1} and _字段名2 = #{item._java类映射_字段名2}
                        and _字段名3 = #{item._java类映射_字段名3} and _字段名4 = #{item._java类映射_字段名4})
            </if>
        </foreach>
        )
    </insert>

插入数据去重:
<foreach collection="viewList" item="item" index="index" separator="UNION">
separator="UNION"
union去重并排序,union all直接返回合并的结果,不去重也不排序;


不过,上面这个union去重是指需插入的数据去重,且只能去重一模一样的数据
如何做到插入数据的时候,判断表里是否有包含指定的字段的数据是一致,其他字段不做判断,若指定的字段有一致的,则不插入数据, 需在插入数据的后面增加以下判断

where not exists (
   select 1 from _表名 where _字段名1 = #{item._java类映射_字段名1} 
   			and _字段名2 = #{item._java类映射_字段名2}
             and _字段名3 = #{item._java类映射_字段名3} 
             and _字段名4 = #{item._java类映射_字段名4}
             )
  1. union去重并排序,union all直接返回合并的结果,不去重也不排序;
  2. from dual 的Dual简单的说就是一个空表bai,Oracle提供的最小的工作表。
  3. <foreach >的具体用法:Mybatis——foreach用法
  4. not exists (sql 不返回结果集,为真);exists (sql 返回结果集,为真)
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北海南风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值