mybatis+oracle添加数据时如果数据存在就更新,如果不存在就插入


<insert id="insertBill" parameterType="java.util.List">

<!-- 普通的批量插入数据
注意:

  mybatis的jdbcType的值必须是全部大写,#{item.billCode,jdbcType=VARCHAR}

  Mybatis中jdbcType的整数类型应该为NUMERIC,而不是oracle中的整形NUMBER

-->
insert all
<foreach collection="list" item="item" index="index" >
into T_INTERF_XUE_BILL_TLJ
( bill_code, SEND_DATE, PIECE_NUMBER, BILL_WEIGHT,
REGISTER_DATE, REGISTER_MAN, REGISTER_MAN_CODE, REGISTER_SITE, REGISTER_SITE_CODE
)
values
(
#{item.billCode,jdbcType=VARCHAR} ,
#{item.sendDate,jdbcType=DATE} ,
#{item.pieceNumber,jdbcType=NUMERIC} ,
#{item.billWeight,jdbcType=NUMERIC} ,
#{item.registerDate,jdbcType=DATE} ,
#{item.registerMan,jdbcType=VARCHAR} ,
#{item.registerManCode,jdbcType=VARCHAR} ,
#{item.registerSite,jdbcType=VARCHAR},
#{item.registerSiteCode,jdbcType=VARCHAR}
)
</foreach>
select 1 from dual
</insert>

但是大部分业务是这样的,添加数据时如果数据存在就更新,如果不存在就插入,


<insert id="insertBill" parameterType="java.util.List">

        merge into T_INTERF_XUE_BILL_TLJ t
        using(
        <foreach collection="list" item="item" index="index" separator="union">
            select
            #{item.billCode,jdbcType=VARCHAR} bill_code ,
            #{item.sendDate,jdbcType=DATE} send_date,
            #{item.pieceNumber,jdbcType=NUMERIC} piece_number ,
            #{item.billWeight,jdbcType=NUMERIC} bill_weight,
            #{item.registerDate,jdbcType=DATE} register_date,
            #{item.registerMan,jdbcType=VARCHAR} register_man,
            #{item.registerManCode,jdbcType=VARCHAR} register_man_code,
            #{item.registerSite,jdbcType=VARCHAR} register_site,
            #{item.registerSiteCode,jdbcType=VARCHAR} register_site_code
            from dual
        </foreach>) t1
        on (t.bill_code = t1.bill_code)
        when matched then
        update set
        t.send_date = t1.send_date,
        t.piece_number = t1.piece_number,
        t.bill_weight = t1.bill_weight,
        t.register_date = t1.register_date,
        t.register_man = t1.register_man,
        t.register_man_code = t1.register_man_code,
        t.register_site = t1.register_site,
        t.register_site_code = t1.register_site_code
        when not matched then
        insert
        (bill_code,send_date,piece_number,bill_weight,register_date,register_man,
         register_man_code,register_site,register_site_code)
        values
        (t1.bill_code,t1.send_date,t1.piece_number,t1.bill_weight,t1.register_date,
         t1.register_man,t1.register_man_code,t1.register_site,t1.register_site_code)
    </insert>

 上述sql格式如下:

merge into 要修改的表名  别名1

using (select  要修改的字段1,要修改的字段2,  关联的字段 from 表名) 别名2

on (别名1.关联字段 = 别名2. 关联字段)

when matched  then update  set

 别名1.字段 = 别名2.字段

 别名1.字段 = 别名2.字段
原文地址:https://www.cnblogs.com/dragon-lan/p/15177098.html