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 ...
随机推荐
- Noip模拟21(持续翻车)2021.7.20
读题总是读错是不是没救了... T1 Median 中位数:按顺序排列的一组数据中居于中间位置的数. 能用上的高亮符号都用上了... 当时忘了就离谱.... 理解什么是中位数(真是个憨憨)后就可以开始 ...
- FastAPI 学习之路(五十九)封装统一的json返回处理工具
这之前的接口,我们返回的格式都是每个接口异常返回的数据格式都会不一样,我们处理起来没有那么方便,我们可以封装一个统一的json处理. 那么我们看下如何来实现呢 from fastapi import ...
- 洛谷 P2120 [ZJOI2007] 仓库建设
链接: P2120 题意: 有 \(n\) 个点依次编号为 \(1\sim n\).给出这 \(n\) 个点的信息,包括位置 \(x_i\),所拥有的的物品数量 \(p_i\),在此建设一个仓库的费用 ...
- surrounded-regions leetcode C++
Given a 2D board containing'X'and'O', capture all regions surrounded by'X'. A region is captured by ...
- 2021 ICPC Gran Premio de Mexico 2da Fecha部分题题解
前面的水题,在队友的配合下,很快就拿下了,剩下几道大毒瘤题,一直罚座三个小时,好让人自闭...但不得不说,这些题的质量是真的高! H. Haunted House 首先看这个题,大眼一扫,觉得是某种数 ...
- Oracle的主要组件和基本概念
oracle 简介 oracle(甲骨文)公司 1977年,三人合伙创办(Software Development Laboratories,SDL) 1979年,更名为Relational Soft ...
- MYSQL5.7下载安装图文教程
MYSQL5.7下载安装图文教程 一. MYSQL两种安装包格式 MySQL安装文件分为两种,一种是msi格式的,一种是zip格式的.zip格式相当于绿色版,不需要安装,只需解压缩之后就可以使用了,但 ...
- Java线程状态及同步锁
线程的生命历程 线程的五大状态 创建状态:简而言之,当创建线程对象的代码出现的时候,此时线程就进入了创建状态.这时候的线程只是行代码而已.只有调用线程的start()方法时,线程的状态才会改变,进入就 ...
- 执行对象Statement、PreparedStatement和CallableStatement详解
执行对象是SQL的执行者,SQL是"安排好的任务",执行对象就是"实际工作的人". 执行对象有三种: Statement.PreparedStatement和C ...
- VLAN实验
VLAN实验 如图所示:图中共有四个广播域,左边逻辑的分为两个广播域,右边也是逻辑的分为两个广播域, 配置顺序先配置交换机,在配置路由器 SW1 配置: 1.首先创建vlan [sw1]vlan ba ...