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

实体类:

@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. qgis3.16.6+vs2017再编译(debug+release)

    参考 https://www.cnblogs.com/superbi/p/11188145.html 文章以及其它文章,对qggis3.16.6进行了重新编译 一.编译准备 1.Cygwin 1.1安 ...

  2. PCB板HDI板几阶是什么意思

    http://blog.sina.com.cn/s/blog_55ff6d5d0102xxvx.html

  3. 用C++实现的数独解题程序 SudokuSolver 2.6 的新功能及相关分析

    SudokuSolver 2.6 的新功能及相关分析 SudokuSolver 2.6 的命令清单如下: H:\Read\num\Release>sudoku.exe Order please: ...

  4. 《手把手教你》系列技巧篇(三十六)-java+ selenium自动化测试-单选和多选按钮操作-番外篇(详解教程)

    1.简介 前边几篇文章是宏哥自己在本地弄了一个单选和多选的demo,然后又找了网上相关联的例子给小伙伴或童鞋们演示了一下如何自动化测试,这一篇宏哥在网上找了一个问卷调查,给小伙伴或童鞋们来演示一下.上 ...

  5. vcs(UST)Undefined System Task Call

    转载:VCS求助啊 - 微波EDA网 (mweda.com) Error-[UST] Undefined System Task Call../../path/bench/path.v, 51Unde ...

  6. Github图床设置

    创建新仓库 点击右上角加号->新建仓库,填写基本信息后点击下面的创建即可 https://github.com/new 创建新令牌 点击设置->开发者设置->私人令牌->生成新 ...

  7. 区块链开发学习第三章:私有链上部署helloBlockchain简单合约

    前面讲了部署私有链以及新增账户,现在进行到了部署合约了,此操作真是踩了无数无数无数的坑,到写文章为止确实是已经部署好了,但是还有些坑是还没有解决的! 一.Solidity编译器 开始的时候用的http ...

  8. Linux&C网络编程————“聊天室”

    从上周到现在一直在完成最后的项目,自己的聊天室,所以博客就没怎么跟了,今天晚上自己的聊天室基本实现,让学长检查了,也有好些bug,自己还算满意,主要实现的功能有: 登录注册 附近的人(服务器端全部在线 ...

  9. TCP粘"包"问题浅析及解决方案Golang代码实现

    一.粘"包"问题简介 在socket网络编程中,都是端到端通信,客户端端口+客户端IP+服务端端口+服务端IP+传输协议就组成一个可以唯一可以明确的标识一条连接.在TCP的sock ...

  10. Vmware 中 Kali linux 2020 设置共享文件夹

    前言 kali2020已经自带vmware-tools工具,因此,只要是原装的kali2020是不需要继续安装vmhgfs工具的. 过程 vmware 设置共享目录 使用vmware-hgfsclie ...