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

mybatis批量新增或更新的更多相关文章

  1. MyBatis批量新增和更新

    之前有开发任务一个接口里面有大量的数据新增和更新操作,导致十分缓慢.使用了批量操作之后速度有明显提升,几乎百倍千倍的速度提升. 博主之前统计过,通过普通接口一次数据库插入大概需要200ms,对于大量新 ...

  2. mysql批量新增或者更新

    1.批量更新或者新增 1.单个新增或者更新 keyProperty新增完之后返回Id值

  3. mybatis 批量新增-批量修改-批量删除操作

    mapper.xml <!-- 批量新增 --> <insert id="saveBatch" parameterType="java.util.Lis ...

  4. Mybatis 批量插入和更新小例

    SpringBoot配置Mybatis前文有博文,数据库mysql: package com.example.demo.biz.dto; public class User { private int ...

  5. Oracle+Mybatis批量插入,更新和删除

    1.插入 (1)第一种方式:利用<foreach>标签,将入参的list集合通过UNION ALL生成虚拟数据,从而实现批量插入(验证过) <insert id="inse ...

  6. mybatis批量插入和更新

    批量插入 <insert id="add" parameterType="java.util.List"> insert all <forea ...

  7. Mybatis批量添加、更新小结

    虽然是很基础的东西,不过难免会忘记,所以写个笔记巩固一下,顺便分享. 实体类: @Data public class EventOrder { ​ private Long id; ​ private ...

  8. [置顶] mybatis批量新增系列之有主键的表的批量新增

    前面介绍了无主键的表的批量插入,文章地址:http://blog.csdn.net/zhouxiaoyun0228/article/details/9980181 但是在开发中往往许多的表是需要主键的 ...

  9. mybatis批量新增报错 BadSqlGrammarException

    org.springframework.jdbc.BadSqlGrammarException: ### Error updating database. Cause: com.mysql.jdbc. ...

随机推荐

  1. 网页禁止右键,禁止F12,禁止选中,禁止复制,禁止缓存等操作

    一.禁止右键 //方法一 document.onmousedown = function () { ) { return false; } } //方法二 document.oncontextmenu ...

  2. 数据分析 - pandas

    简介 pandas是一个强大的Python数据分析的工具包,它是基于Numpy构建的,正因pandas的出现,让Python语言也成为使用最广泛而且强大的数据分析环境之一. Pandas的主要功能: ...

  3. WGS84与CGCS2000坐标系

    1.WGS84,WGS是世界大地测量系统World Geodetic System的缩写,84是说此坐标系是1984年建立的:   2.自上世纪60年代,美国军方相继推出WGS60.WGS66.WGS ...

  4. cc2530的第二次实验,用按键控制流水灯

    按键控制流水灯 具体想要实现按一下按键,然后单片机的三个灯会以流水灯的形式都亮一遍 实验相关寄存器 实验相关电路 宏定义 #define uint unsigned int #define uchar ...

  5. UFUN函数 UF_CSYS UF_MODL UF_OBJ函数(建模注意坐标系);

    //用到的函数 //UF_MODL_create_block1 ,UF_MODL_ask_feat_body,UF_OBJ_set_name,UF_CSYS_map_point UF_initiali ...

  6. js中call,apply,bind方法的用法

    call .apply.和bind 以上这三个方法都是js function函数当中自带的方法,用来改变当前函数this的指向. call()方法 语法格式: fun.call(thisArg[,ar ...

  7. Xamarin.Forms之样式

    使用XAML样式设置Xamarin.Forms应用的样式Xamarin.Forms应用程序的样式传统上是通过使用Style类将一组属性值分组到一个对象中来完成的,然后可以将其应用于多个视觉元素实例. ...

  8. cloudevents js sdk 简单试用

    cloudevents 目前官方提供了不同语言的sdk,以下是js 的简单学习试用,从目前来说更新不是很好 clone 代码 git clone https://github.com/cloudeve ...

  9. 使用s3-sftp-proxy 暴露minio s3 数据为sftp 访问

    尽管s3 很不错,但是ftp 也有自己存在的价值,以下是一个简单的通过s3-sftp-proxy 暴露minio s3 数据为ftp 的访问方式 环境准备 docker-compose 文件 vers ...

  10. eclipse中的maven插件

    导入一个maven项目,一直报错:org.codehaus.plexus.archiver.jar.Manifest.write(java.io.PrintWriter)的错误 Description ...