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. wordpress获取当前页面链接

    我们知道wordpress的<?php the_permalink(); ?>和<?php echo get_permalink(); ?>可以获取页面链接,但是有些比较复杂的 ...

  2. 函数式编程:面向monad和pipeline编程

    将平凡对象转化为monand对象: 将monand对象串联起来进行业务处理.

  3. 一个项目设置两个git地址,并最终实现一次性同时推送到到两个git地址上的方法总结

    基于多处备份的想法,确保自己的代码不丢失.或者是代码的git本身搭建在自己公司的服务上,而你为了保险起见,想把项目同时放在码云或者github上面. 这样,你就需要让一个项目同时备份在两个云端,这样即 ...

  4. 鸿蒙OS

    8月9日,华为消费者业务在其全球开发者大会上正式发布其全新的基于微内核的面向全场景的分布式操作系统——鸿蒙OS(HarmonyOS)! 鸿蒙的定义是基于微内核的全场景分布式操作系统.其中,微内核是技术 ...

  5. 洛谷p3398仓鼠找suger题解

    我现在爱死树链剖分了 题目 具体分析的话在洛谷blog里 这里只是想放一下改完之后的代码 多了一个son数组少了一个for 少了找size最大的儿子的for #include <cstdio&g ...

  6. 信息学奥赛一本通 提高篇 序列第k个数 及 快速幂

    我是传送门 这个题首先是先判断是等差还是等比数列 等差的话非常简单: 前后两个数是等差的,举个栗子: 3 6 9 12 这几个数,(我感觉 1 2 3 4并说明不了什么) 每次都加3嘛,很容易看出,第 ...

  7. 因子分解机 FM

    特征组合 人工方式的特征工程,通常有两个问题: 特征爆炸 大量重要的特征组合都隐藏在数据中,无法被专家识别和设计 针对上述两个问题,广度模型和深度模型提供了不同的解决思路. 广度模型包括FM/FFM等 ...

  8. 系统权限远程线程注入到Explorer.exe

    目录 提升为系统权限,注入到explorer中 一丶简介 二丶注入效果图 提升为系统权限,注入到explorer中 一丶简介 我们上一面说了系统服务拥有系统权限.并且拥有system权限.还尝试启动了 ...

  9. NOTIC: [8] Trying to get property of non-object

      NOTIC: [8] Trying to get property of non-object /home/wwwroot/qwsd/Application/Admin/Controller/Pr ...

  10. js 计算总页数的最高效方式

    js 计算总页数的最高效方式 /** * [getTotalPageNum 获取页码总数] * @param {[type]} totalRecord [总记录] * @param {[type]} ...