mybatis批量新增或更新


mysql中在INSERT語句末尾指定了ON DUPLICATE KEY UPDATE時,向數據庫中插入一條記錄:

  若插入數據的主鍵值/ UNIQUE KEY 已經在表中存在,則執行更新操作(UPDATE 后面的操作),否則插入一條新的記錄

格式

INSERT tbl_name [(col_name,...)]
    VALUES (expr,...),(...),...
    ON DUPLICATE KEY UPDATE
      col_name=expr
        [, col_name=expr] ... 

在mybatis中實現批量增加或修改

(1)參數類型為List

xxxMapper.xml

<insert id="batchAddAssets" useGeneratedKeys="true" parameterType="java.util.List">
    <selectKey resultType="INTEGER" keyProperty="id" order="AFTER">
        SELECT
        LAST_INSERT_ID()
    </selectKey>
    insert into api_assets (`guid`,`name`,`level`,`type`,`file_id`,`line_no`,`description`,`parent_guid`)
    values
    <foreach collection="list" item="item" index="index" separator=",">
        (#{item.guid},#{item.name},#{item.level},#{item.type},#{item.fileId},#{item.lineNo},#{item.description},#{item.parentGuid})
    </foreach>
    ON DUPLICATE KEY UPDATE
    `name`=values(`name`),`level`=values(`level`),`type`=values(`type`),`line_no`=values(`line_no`),`description`=values(`description`),`parent_guid`=values(`parent_guid`)
</insert>

xxxMapper.java

void batchAddAssets(@Param("list") List<ApiAssets> list);

(2)參數類型為類

xxxMapper.xml

<insert id="addStructures" useGeneratedKeys="true" parameterType="com.tydt.bim.model.ApiStructures">
        <selectKey resultType="INTEGER" keyProperty="id" order="AFTER">
            SELECT
            LAST_INSERT_ID()
        </selectKey>
        insert into api_structures (`name`,`file_id`,`guid`,`parent_guid`,`level`,`type`)
        values
        (#{struc.name},#{struc.fileId},#{struc.guid},#{struc.parentGuid},#{struc.level},#{struc.type})
        ON DUPLICATE KEY UPDATE
        `name`=values(`name`),`level`=values(`level`),`type`=values(`type`),`parent_guid`=values(`parent_guid`)
</insert>

xxxMapper.java

void addStructures(@Param("struc") ApiStructures struc);

foreach說明:

  主要用在構建in條件中,它可以在SQL語句中進行迭代一個集合。

  foreach元素的屬性主要有 item,index,collection,open,separator,close。

    item表示集合中每一個元素進行迭代時的別名

    index指 定一個名字,用於表示在迭代過程中,每次迭代到的位置

    open表示該語句以什么開始

    separator表示在每次進行迭代之間以什么符號作為分隔 符

    close表示以什么結束

    collection屬性,是必須指定的,但是在不同情況 下,該屬性的值是不一樣的,主要有:

      如果傳入的是單參數且參數類型是一個List的時候,collection屬性值為list

      如果傳入的是單參數且參數類型是一個array數組的時候,collection的屬性值為array

      如果傳入的參數是多個,就需要把它們封裝成一個Map

 parameterType說明:  

  基本數據類型:

    包含int,String,Date等。作為傳參,只能傳入一個。通過#{參數名} 即可獲取傳入的值 

  復雜的數據類型:

    包含JAVA實體類、Map。通過#{屬性名}或#{map的KeyName}即可獲取傳入的值

注:

  可以傳遞一個List實例或者數組作為參數對象傳給MyBatis。這時,MyBatis會自動將它包裝在一個Map中,用名稱在作為鍵。List實例將會以“list”作為鍵,而數組實例將會以“array”作為鍵。


免責聲明!

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



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