虽然是很基础的东西,不过难免会忘记,所以写个笔记巩固一下,顺便分享。

实体类:

@Data
public class EventOrder {

private Long id;

private String eventName;

private Integer eventType;

private String orderNo;

}

表字段:

批量添加

<sql id="BaseColumn">
`id`, event_name, event_type, order_no
</sql> <insert id="batchInsertByValues" parameterType="com.zyuan.boot.entity.EventOrder">
insert into event_order
(<include refid="BaseColumn"/>)
values
<foreach collection="eventOrders" item="item" separator=",">
(
#{item.id}, #{item.eventName}, #{item.eventType}, #{item.orderNo}
)
</foreach>
</insert>

< foreach >标签中,collection表示传入的集合名,item为每个元素,separator为分隔符

xml对应的mapper文件中最好加上@Param注解,保证准确性:

void batchInsertByValues(@Param("eventOrders") List<EventOrder> eventOrders);

测试:

@Autowired
private EventOrderMapper eventOrderMapper;

@Test
public void batchInsertByValues() {
List<EventOrder> eventOrders = getList();
eventOrderMapper.batchInsertByValues(eventOrders);
}

private List<EventOrder> getList() {
List<EventOrder> eventOrders = new ArrayList<>();
for (Long i = 1L; i <= 10; i++) {
EventOrder addEntity = new EventOrder();
addEntity.setId(i);
addEntity.setEventName("事件" + i);
addEntity.setEventType(1);
addEntity.setOrderNo("2");
eventOrders.add(addEntity);
}
return eventOrders;
}

打印的sql语句:

INSERT INTO event_order ( `id`, event_name, event_type, order_no )
VALUES
( ?, ?, ?, ? ),
( ?, ?, ?, ? ),
( ?, ?, ?, ? ),
( ?, ?, ?, ? ),
( ?, ?, ?, ? ),
( ?, ?, ?, ? ),
( ?, ?, ?, ? ),
( ?, ?, ?, ? ),
( ?, ?, ?, ? ),
( ?, ?, ?, ? )

批量更新

<update id="batchUpdate" parameterType="com.zyuan.boot.entity.EventOrder">
update event_order
<trim prefix="set" suffixOverrides=",">
<trim prefix="event_name = case" suffix="end,">
<foreach collection="eventOrders" item="item">
when `id` = #{item.id} then #{item.eventName}
</foreach>
</trim>
<trim prefix="event_type = case" suffix="end,">
<foreach collection="eventOrders" item="item">
when `id` = #{item.id} then #{item.eventType}
</foreach>
</trim>
<trim prefix="order_no = case" suffix="end">
<foreach collection="eventOrders" item="item">
when `id` = #{item.id} then #{item.orderNo}
</foreach>
</trim>
</trim>
where id in
<foreach collection="eventOrders" item="item" open="(" close=")" separator=",">
#{item.id}
</foreach>
</update>

解释:第一个< trim >用于拼接set前缀以及标签中所有< trim >连接的 “,” ,然后里面的< trim >,prefix存放的是:“被修改字段” + “=” + “case” ,suffix存放的是case的终止关键字end,foreach是为了遍历出所有id的情况并通过then来给值。

打印sql:

UPDATE event_order
SET
event_name =
CASE
WHEN `id` = ? THEN ?
WHEN `id` = ? THEN ?
WHEN `id` = ? THEN ?
WHEN `id` = ? THEN ?
END,

event_type =
CASE
WHEN `id` = ? THEN ?
WHEN `id` = ? THEN ?
WHEN `id` = ? THEN ?
WHEN `id` = ? THEN ?
END, order_no =
CASE
WHEN `id` = ? THEN ?
WHEN `id` = ? THEN ?
WHEN `id` = ? THEN ?
WHEN `id` = ? THEN ?
END
WHERE
id IN ( ?, ?, ?, ? )

还有一种通过循环的方式来更新,但是并不推荐使用,参考:

<update id="batchUpdateByForeach" parameterType="com.zyuan.boot.entity.EventOrder">
<foreach collection="eventOrders" item="item" separator=";">
update event_order
set `event_name` = #{item.eventName},
`event_type` = #{item.eventType},
`order_no` = #{item.orderNo}
where `id` = #{item.id}
</foreach>
</update>

因为集合有多少数据,就执行多少次update,并不高效

使用Map操作

<update id="batchUpdateByMap" parameterType="java.util.Map">
update event_order
<trim prefix="set" suffixOverrides=",">
<trim prefix="event_name = case" suffix="end,">
<foreach collection="eventOrderMap.entrySet()" item="value" index="key">
when `id` = #{key} then #{value.eventName}
</foreach>
</trim>
<trim prefix="event_type = case" suffix="end,">
<foreach collection="eventOrderMap.entrySet()" item="value" index="key">
when `id` = #{key} then #{value.eventType}
</foreach>
</trim>
<trim prefix="order_no = case" suffix="end">
<foreach collection="eventOrderMap.entrySet()" item="value" index="key">
when `id` = #{key} then #{value.orderNo}
</foreach>
</trim>
</trim>
where id in
<foreach collection="eventOrderMap.entrySet()" item="value" index="key" open="(" close=")" separator=",">
#{key}
</foreach>
</update>

解释:其实map的循环只需要利用entrySet即可,并且在< foreach >标签中,index其实代表的就是map中的key,而遍历entrySet,,他的每一个元素就是value,其他的写法就与上面的批量更新一致。

测试:

@Test
public void batchUpdateByMap() {
// key为id,value为对象
Map<Long,EventOrder> eventOrderMap = getUpdateMap();
eventOrderMapper.batchUpdateByMap(eventOrderMap);
}

private Map<Long,EventOrder> getUpdateMap() {
Map<Long,EventOrder> eventOrderMap = new HashMap<>();
for (Long i = 1L; i <= 10; i++) {
EventOrder addEntity = new EventOrder();
addEntity.setId(i);
addEntity.setEventName(i + "事件");
addEntity.setEventType(11);
addEntity.setOrderNo("20.21");
eventOrderMap.put(i,addEntity);
}
return eventOrderMap;
}

打印SQL:

UPDATE event_order
SET event_name =
CASE
WHEN `id` = ? THEN
?
WHEN `id` = ? THEN
?
WHEN `id` = ? THEN
?
WHEN `id` = ? THEN
?
END,
event_type =
CASE
WHEN `id` = ? THEN
?
WHEN `id` = ? THEN
?
WHEN `id` = ? THEN
?
WHEN `id` = ? THEN
?
END,
order_no =
CASE
WHEN `id` = ? THEN
?
WHEN `id` = ? THEN
?
WHEN `id` = ? THEN
?
WHEN `id` = ? THEN
?
END
WHERE
id IN ( ?, ?, ?, ? )

Mybatis批量添加、更新小结的更多相关文章

  1. Mybatis 批量添加,批量更新

    此篇适合有一定的mybatis使用经验的人阅读. 一.批量更新 为了提升操作数据的效率,第一想到的是做批量操作,直接上批量更新代码: <update id="updateBatchMe ...

  2. ado.net 批量添加 更新 删除

    自曾列就别往下看 别折腾了   使用 SqlBulkCopy ,dataTable 必须跟sql里面的表字段完全一样 下面在sqlserver中演示 mysql 请google MySqlBulkLo ...

  3. Mybatis批量添加对象List

    1.对应的xml文件: <!--批量添加--><insert id="insertStandardItemInfo" parameterType="ha ...

  4. mybatis批量添加、批量删除

    <!-- 批量添加 --> <insert id="insertNameListSynHisBatch" parameterType="java.uti ...

  5. myBatis批量添加实例

    <!-- 批量添加中转地数据 -->      <insert id="addBatch" parameterType="com.isoftstone. ...

  6. mybatis 批量添加数据的两种实现方式

    做开发的这几年期间经常遇到类似处理这种形式数据的问题,也遇到很多刚刚入行的新同学,发现他们做处理这块,经验不够,今天特地整理了一下,大家都会遇到的几种情况,代码也都粘贴出来了,拿去不谢,有时间大家还是 ...

  7. MyBatis批量添加和删除

    一.批量插入 二.批量删除

  8. Mybatis -- 批量添加 -- insertBatch

    啦啦啦 ---------------InsertBatch Class : Dao /** * 批量插入perfEnvirons * * @author Liang * * 2017年4月25日 * ...

  9. myBatis批量添加,修改和删除

    摘自: http://blog.csdn.net/myjlvzlp/article/details/8434376 1.批量添加元素session.insert(String string,Objec ...

随机推荐

  1. Python课程笔记(十)

    不陌生,之前学习一个开源SpringBoot项目,Mysql5.5更换到5.7搞得头疼. 数据库连接的坑之前写的IDEA系列连接会遇到的问题.课程代码 今天上课就主要学习了python如何连接mysq ...

  2. 摘录:ddr3内存条时序概念

    本文摘自:内存系列二:深入理解硬件原理 - 知乎 (zhihu.com),感谢作者! 上次虽然解决了小张的问题,却引发了他对内存原理的兴趣.这不他又来找我了,说我还欠他一个解释.这次我们约在一个咖啡馆 ...

  3. QT判断文件/目录是否存在

    最近在用qt写一个ui,遇到删除sd卡中的文件失败情况,有些时候是存在删除链表里面的文件在sd卡上已经不存在了,导致失败,以为我的链表是定时刷新的,但是文件是实时更新会同步覆盖的.这样就存在可能上一秒 ...

  4. jquery 实现 <imput>标签 密码框显示/隐藏密码功能

    1 <!doctype html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 < ...

  5. Java Logback简易教程

    本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可. 一.前言 本文以一个简单的项目为例,一步步展示logback的同步和异步配置方法,并且配置的日志要求满足阿里巴巴Java开发手册- ...

  6. ELK集群之kafka(7)

    原理待补充: kafka依赖于zookeeper集群. 都是基于java 由于源码安装jdk 未声明bin下java 在各自server配置文件中声明 JAVA_HOME=/usr/local/jdk ...

  7. AliRTC 开启视频互动 “零计算” 时代

    在 2021 云栖大会<产业视频化创新与最佳实践>视频云主题论坛中,阿里云智能高级技术专家在<AliRTC 开启视频互动 "零处理" 时代>的主题演讲中,发 ...

  8. loadruuner12基准测试流程

    基准测试:单用户测试 一.归纳基准测试: 方法一:单用户循环5次 1.调试好脚本(加检查点,在VuGen中运行成功) 2.打开控制台,设置Run-time Settings 3.迭代次数:5 4.Pa ...

  9. Cannot load module file xxx.iml的两种解决方法

    一. 一种是点击左上角File,然后点击Invalidate Caches / Restart...,弹出对话框再点击Invalidate and Restart等待工程重新加载,问题就解决了. 二. ...

  10. 了解php数据库常用语法增删改查

    数据库基本语法 MySQL增:insert into 表名 (字段1,...,字段n) values (值1,...,值n) MySQL删:delete from 表名 where 条件 MySQL改 ...