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

posted @ 2019-08-14 19:01  慕尘  阅读(5651)  评论(0编辑  收藏  举报