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”作為鍵。