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

实体类:

@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. 『学了就忘』Linux基础 — 13、Linux系统的分区和格式化

    目录 1.Linux系统的分区 (1)磁盘分区定义 (2)两种分区表形式 (3)MBR分区类型 2.Linux系统的格式化 (1)格式化定义 (2)格式化说明 1.Linux系统的分区 (1)磁盘分区 ...

  2. 数组模拟双链表,你get到了吗?

    数组模拟双链表 通过前面的学习我们知道单链表是单个指针指向操作,那么通过类比我们可以把指针设定为两个,并且让它们分别指向前后数据,这就是"双向链表".使用这种链表,不仅可以从前往后 ...

  3. Linux题目学习

    一.填空题: 1. 在Linux系统中,以 文件 方式访问设备 . 2. Linux内核引导时,从文件/etc/fstab 中读取要加载的文件系统. 3. Linux文件系统中每个文件用 i节点来标识 ...

  4. Spring Cloud Gateway 整合阿里 Sentinel网关限流实战!

    大家好,我是不才陈某~ 这是<Spring Cloud 进阶>第八篇文章,往期文章如下: 五十五张图告诉你微服务的灵魂摆渡者Nacos究竟有多强? openFeign夺命连环9问,这谁受得 ...

  5. 记一次排查CPU高的问题

    背景 将log4j.xml的日志级别从error调整为info后,进行压测发现CPU占用很高达到了90%多(之前也就是50%,60%的样子). 问题排查 排查思路:  看进程中的线程到底执行的是什么, ...

  6. 使用getopt 解析参数

    getopt被用来解析命令行选项参数. #include <unistd.h> extern char *optarg; //选项的参数指针 extern int optind, //下一 ...

  7. nio实现文件夹内容的监听

    参考的博客 package com.jp.filemonitor; import java.io.IOException; import java.nio.file.FileSystems; impo ...

  8. adduser vs useradd

    Always use adduser (and deluser when deleting users) when you're creating new users from the command ...

  9. Android ANR从原理到日志分析,记下来就够了

    站在巨人的肩膀上可以看的更远 做一个优秀的搬运工 Android 彻底理解安卓应用无响应机制 Android ANR日志分析全面解析 优秀的文章不可独享,要扩散,要做好笔记,哈 <沁园春长沙&g ...

  10. PTA7-2 愿天下有情人都是失散多年的兄妹

    呵呵.大家都知道五服以内不得通婚,即两个人最近的共同祖先如果在五代以内(即本人.父母.祖父母.曾祖父母.高祖父母)则不可通婚.本题就请你帮助一对有情人判断一下,他们究竟是否可以成婚? 输入格式: 输入 ...