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”作为键。