mysql 批量操作,已存在則修改,不存在則insert,同時判斷空選擇性寫入字段


注:如果是批量插入需要在 Java 連接數據庫的字串中設置 &allowMultiQueries=true

針對單行數據有則修改無則新增

本案例的建表語句是:

-- auto-generated definition
create table contact_type
(
    sid varchar(50) not null primary key,
    name varchar(50) default '' null,
    status int default 1 null comment '狀態,默認1表示有效,0為凍結',
    seq float default 0 null,
    create_time datetime default CURRENT_TIMESTAMP null
)
comment '往來單位類型'

所以主鍵是字符串類型,而不是自增類型。寫在 Mybatis 的 xml 文件中的SQL語句如下:

<insert id="saveOne" parameterType="com.ccsoft.femis.model.ContactType">
    <!--<selectKey resultType="java.lang.Integer" keyProperty="id" order="AFTER">-->
      <!--SELECT LAST_INSERT_ID()-->
    <!--</selectKey>-->

    insert into contact_type
    <trim prefix="(" suffix=")" suffixOverrides=",">
      <if test="create_time != null"> create_time, </if>
      <if test="name != null"> name, </if>
      <if test="seq != null"> seq, </if>
      <if test="sid != null"> sid, </if>
      <if test="status != null"> status, </if>
    </trim>
    values
    <trim prefix="(" suffix=")" suffixOverrides=",">
      <if test="create_time != null"> #{create_time},</if>
      <if test="name != null"> #{name},</if>
      <if test="seq != null"> #{seq},</if>
      <if test="sid != null"> #{sid},</if>
      <if test="status != null"> #{status},</if>
    </trim>
    ON DUPLICATE KEY UPDATE
    <trim suffixOverrides=",">
      <if test="create_time != null"> create_time = #{create_time}, </if>
      <if test="name != null"> name = #{name}, </if>
      <if test="seq != null"> seq = #{seq}, </if>
      <if test="sid != null"> sid = #{sid}, </if>
      <if test="status != null"> status = #{status}, </if>
    </trim>
  </insert>

 

批量寫入數據有則修改無則新增,同時判斷空選擇性寫入字段

數據表還是上面的,直接貼出寫在 Mybatis 的 XML 文件中的 SQL 是:

<insert id="saveBatch" parameterType="java.util.List">
    <!--<selectKey resultType="java.lang.String" keyProperty="sid" order="AFTER">-->
      <!--SELECT LAST_INSERT_ID()-->
    <!--</selectKey>-->

    <foreach collection ="list" item="ele" index= "index" separator =";">
      insert into contact_type
      <trim prefix="(" suffix=")" suffixOverrides=",">
        <if test="ele.create_time != null"> create_time, </if>
        <if test="ele.name != null"> name, </if>
        <if test="ele.seq != null"> seq, </if>
        <if test="ele.sid != null"> sid, </if>
        <if test="ele.status != null"> status, </if>
      </trim>
      values
      <trim prefix="(" suffix=")" suffixOverrides=",">
        <if test="ele.create_time != null"> #{ele.create_time},</if>
        <if test="ele.name != null"> #{ele.name},</if>
        <if test="ele.seq != null"> #{ele.seq},</if>
        <if test="ele.sid != null"> #{ele.sid},</if>
        <if test="ele.status != null"> #{ele.status},</if>
      </trim>
      ON DUPLICATE KEY UPDATE
      <trim suffixOverrides=",">
        <if test="ele.create_time != null"> create_time = #{ele.create_time}, </if>
        <if test="ele.name != null"> name = #{ele.name}, </if>
        <if test="ele.seq != null"> seq = #{ele.seq}, </if>
        <if test="ele.sid != null"> sid = #{ele.sid}, </if>
        <if test="ele.status != null"> status = #{ele.status}, </if>
      </trim>
    </foreach>
  </insert>

上面代碼中在 SQL 語句的最外層使用了 for 循環,好處是將 List<ContactType> 類型的集合傳遞來寫入數據時可以有的是新增有的是修改,例如3行數據,第一三行由於主鍵字段對應屬性 sid 被設置為 NULL ,會向數據庫中新增行,第二行數據設置了 sid ,並且該值在數據庫中有對應行,那么會修改數據庫中的該行上的數據。不過這種做法也有問題,就是返回給 Java 的數據永遠都是1,因為每個對象構成的 SQL 語句間使用的間隔符號是 ; ,那么最終返回的影響的行數是最后一條 SQL 語句影響的行數。對此有其他見解的話麻煩跟帖科普下

原文鏈接:https://blog.csdn.net/chanchaw/article/details/103546087


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM