Mybatis批量添加、更新小结
虽然是很基础的东西,不过难免会忘记,所以写个笔记巩固一下,顺便分享。
实体类:
@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批量添加、更新小结的更多相关文章
- Mybatis 批量添加,批量更新
此篇适合有一定的mybatis使用经验的人阅读. 一.批量更新 为了提升操作数据的效率,第一想到的是做批量操作,直接上批量更新代码: <update id="updateBatchMe ...
- ado.net 批量添加 更新 删除
自曾列就别往下看 别折腾了 使用 SqlBulkCopy ,dataTable 必须跟sql里面的表字段完全一样 下面在sqlserver中演示 mysql 请google MySqlBulkLo ...
- Mybatis批量添加对象List
1.对应的xml文件: <!--批量添加--><insert id="insertStandardItemInfo" parameterType="ha ...
- mybatis批量添加、批量删除
<!-- 批量添加 --> <insert id="insertNameListSynHisBatch" parameterType="java.uti ...
- myBatis批量添加实例
<!-- 批量添加中转地数据 --> <insert id="addBatch" parameterType="com.isoftstone. ...
- mybatis 批量添加数据的两种实现方式
做开发的这几年期间经常遇到类似处理这种形式数据的问题,也遇到很多刚刚入行的新同学,发现他们做处理这块,经验不够,今天特地整理了一下,大家都会遇到的几种情况,代码也都粘贴出来了,拿去不谢,有时间大家还是 ...
- MyBatis批量添加和删除
一.批量插入 二.批量删除
- Mybatis -- 批量添加 -- insertBatch
啦啦啦 ---------------InsertBatch Class : Dao /** * 批量插入perfEnvirons * * @author Liang * * 2017年4月25日 * ...
- myBatis批量添加,修改和删除
摘自: http://blog.csdn.net/myjlvzlp/article/details/8434376 1.批量添加元素session.insert(String string,Objec ...
随机推荐
- [CSP-S 2021] 回文
题目描述: 给定正整数 n 和整数序列 a1, a2,-,a2n,在这 2n 个数中,1, 2,-,n 分别各出现恰好 2 次.现在进行 2n 次操作,目标是创建一个长度同样为 2n 的序列 b 1, ...
- dfs初步模板解析
#include<stdio.h> int a[10],book[10],n; //这里还有需要注意的地方C语言全局变量默认为0 void dfs(int step){ //此时在第ste ...
- PHP笔记4__函数/全局、静态变量/函数参数/加载函数库/,,
<?php header("Content-type: text/html; charset=utf-8"); echo table(5,5); function table ...
- Centos7 升级过内核 boot分区无法挂载修
参考连接:https://www.cnblogs.com/heqiuyong/p/11186301.html 故障图 挂载系统盘,光盘启动,急救模式, chroot /mnt/sysimage 报错 ...
- 【Java】数组Array
Java基础复习之:数组 简介 数组(Array):多个相同数据类型按照一定顺序排列的集合,并使用一个名字命名,通过编号的方式对这些数据进行统一管理 一维数组 一维数组的声明与初始化 int[] id ...
- 计算机网络-3-5-以太网MAC层及交换机
MAC层的硬件地址 在局域网中,硬件地址又称为物理地址或者MAC地址(因为这种地址用在MAC帧中) IEEE 802标准为局域网规定了一种48位(6字节)的全球地址,固化在适配器的ROM中. 如果计算 ...
- CSS学习笔记:grid布局
目录 一.Grid布局简介 二.Grid布局的一些概念 三. 容器元素属性 1. grid-template-* 1.1 网格行和列的设置 1.2 repeat的使用 1.3 使用fr 1.4 aut ...
- dart系列之:在dart中使用packages
目录 简介 pubspec.yaml get packages 使用packages 升级依赖 总结 简介 java中使用jar包来封装有用的功能,然后将其分发到maven仓库中,供其他人使用.同样的 ...
- [hdu7000]二分
不妨假设$x\le y$,可以通过翻转整个格子序列来调整 令$a_{i}$为$i$到$y$的期望步数,显然有方程$a_{i}=\begin{cases}0&(i=y)\\\frac ...
- [loj3527]地牢游戏
当英雄能力值$\ge 10^{7}$时,即能战胜所有敌人,简单预处理即可 若英雄能力值在$[2^{k},2^{k+1})$中,对敌人分类讨论: 1.若$s_{i}\le 2^{k}$,其必然会战胜这些 ...