背景描述
当我们插入数据时,我们经常会遇到这样的情况:
- 首先判断数据是否存在
- 如果不存在,则插入
- 如果存在,则更新
Mybatis-plus 提供了在service 层的 saveorupdateBatch() 方法,但是这个方法的内部实现原理是一条语句一条语句的去执行,执行效率过低,于是从网上查到了另一个实现方式。具体的实现方式如下:
实现方式
通过sql的方式实现批量的插入或更新,这种方式需要有唯一索引,通过唯一索引去判断是否冲突,有冲突就会更新,没有冲突就会插入数据。
1. 建表语句:
CREATE TABLE stock_change (
id VARCHAR(60) PRIMARY KEY,
stock_symbol VARCHAR(8) NOT NULL, -- 股票代码或符号,例如sh600571等
stock_name VARCHAR(10) NOT NULL, -- 股名称
change_type VARCHAR(10) NOT NULL, -- 异动类型
change_info VARCHAR(60), -- 异动信息
change_date datetime -- 异动时间
);
2. mybatis.xml文件
<!-- 批量插入或者更新 -->
<insert id="saveOrUpdateBatch" keyProperty="id" useGeneratedKeys="true">
insert into stock_change(id,stock_symbol, stock_name, change_type, change_info, change_date)
values
<foreach collection="entities" item="entity" separator=",">
(#{entity.id},#{entity.stockSymbol}, #{entity.stockName}, #{entity.changeType}, #{entity.info},
#{entity.date})
</foreach>
on duplicate key update
stock_symbol = values(stock_symbol),
stock_name = values(stock_name),
change_type = values(change_type),
change_info = values(change_info),
change_date = values(change_date)
</insert>
3.持久层代码示例
@Mapper
public interface StockChangeMapper extends BaseMapper<StockChange> {
boolean saveOrUpdateBatch(@Param("entities") Collection<StockChange> hhChainCustomerParams);
}
个人感觉这样效率更改更方便,值得推荐。
本文参考:https://blog.csdn.net/hauchun/article/details/126488062