Mybatis-Plus批量添加或修改數(shù)據(jù)的3種方式總結
SpringBoot批量添加或修改數(shù)據(jù)的三種方式
方式一.Mybatis-plus 提供的 saveOrUpdateBatch
提供的方法 是遍歷每一個元素,判斷主鍵是否存在,如果存在則做更新,不存在添加


方式二.分組數(shù)據(jù)再批量添加或修改
先獲取表中所有的主鍵 ,然后 判斷是否已存在,存在更新,不存在添加
queryWrapper = new QueryWrapper<>();
queryWrapper.select("PROC_INSTANCEID");
List<BpmProcInstance> bpmProcInstanceList = iBpmProcInstanceDaoService.list(queryWrapper);
//獲取所有主鍵
List<String> procList = bpmProcInstanceList.stream().map(BpmProcInstance::getProcInstanceid).collect(Collectors.toList());
//分組
Map<Boolean, List<BpmProcInstance>> booleanListMap = bpmProcInstances.stream().collect(Collectors.groupingBy(b -> {
return procList.contains(b.getProcInstanceid());
}));
//true 則更新 false 修改
iBpmProcInstanceDaoService.updateBatchById( booleanListMap.get(true));
iBpmProcInstanceDaoService.saveBatch( booleanListMap.get(false));方式三. 利用MySQL的on duplicate key update
on duplicate key update 是Mysql特有的語法,如下圖所示,表中id 為主鍵

再插入id為1的數(shù)據(jù),則提示主鍵已存在
改成如下SQL,則當主鍵重復時,將更新 字段 name 的值
INSERT into provider values (1,'w') ON DUPLICATE KEY UPDATE `name` = 'w';
因此我們可以編寫如下的XML映射語句
insert into 表名 (需插入的字段)
values
<foreach collection="list" item="item" index="index" separator=",">
#插入的數(shù)據(jù)
</foreach>
ON DUPLICATE KEY UPDATE
# 當主鍵重復時,需要更新的字段以及對應的數(shù)據(jù)
字段名1=VALUES(字段名1),
字段名2 =VALUES(字段名2)
......補充:不使用Mybatis-plus進行批量操作
有時候項目里沒有引用Mybatis-plus,但是也想進行批量操作,數(shù)據(jù)量大了后foreach循環(huán)會影響性能。所以可以參考Mybatis-plus的批量操作,編寫在mybatis環(huán)境下的批量操作,代碼如下:
@Component
public class MybatisBatchUtils {
private static final int BATCH_SIZE = 1000;
@Autowired
private SqlSessionFactory sqlSessionFactory;
public <T,U,R> boolean batchUpdateOrInsert(List<T> data, Class<U> mapperClass, BiFunction<T,U,R> function) {
int i = 1;
SqlSession batchSqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
try {
U mapper = batchSqlSession.getMapper(mapperClass);
int size = data.size();
for (T element : data) {
function.apply(element, mapper);
if ((i % BATCH_SIZE == 0) || i == size) {
batchSqlSession.flushStatements();
}
i++;
}
// 非事務環(huán)境下強制commit,事務情況下該commit相當于無效
batchSqlSession.commit(!TransactionSynchronizationManager.isSynchronizationActive());
return true;
} catch (Exception e) {
batchSqlSession.rollback();
throw new RuntimeException(e);
} finally {
batchSqlSession.close();
}
}
}總結
到此這篇關于Mybatis-Plus批量添加或修改數(shù)據(jù)的3種方式的文章就介紹到這了,更多相關Mybatis-Plus批量添加修改數(shù)據(jù)內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
IntelliJ IDEA創(chuàng)建maven web項目的圖文步驟(IDEA新手適用)
這篇文章主要介紹了IntelliJ IDEA創(chuàng)建maven web項目的圖文步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-03-03
利用ScriptEngineManager實現(xiàn)字符串公式靈活計算的方法
今天小編就為大家分享一篇利用ScriptEngineManager實現(xiàn)字符串公式靈活計算的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07
RedisTemplate.opsForHash()用法簡介并舉例說明
redistemplate.opsforhash是RedisTemplate模板類中的一個方法,用于獲取操作哈希數(shù)據(jù)類型的接口,這篇文章主要給大家介紹了關于RedisTemplate.opsForHash()用法簡介并舉例說明的相關資料,需要的朋友可以參考下2024-06-06
Spring?Boot緩存實戰(zhàn)之Redis?設置有效時間和自動刷新緩存功能(時間支持在配置文件中配置)
這篇文章主要介紹了Spring?Boot緩存實戰(zhàn)?Redis?設置有效時間和自動刷新緩存,時間支持在配置文件中配置,需要的朋友可以參考下2023-05-05
Java實現(xiàn)分解任意輸入數(shù)的質因數(shù)算法示例
這篇文章主要介紹了Java實現(xiàn)分解任意輸入數(shù)的質因數(shù)算法,涉及java數(shù)學運算相關操作技巧,需要的朋友可以參考下2017-10-10
SpringBoot對靜態(tài)資源的映射規(guī)則詳解解讀
這篇文章主要介紹了SpringBoot對靜態(tài)資源的映射規(guī)則詳解解讀,在Spring Boot中,映射規(guī)則是用來定義URL與控制器方法之間的映射關系的,通過映射規(guī)則,可以將特定的URL請求映射到相應的控制器方法上,從而實現(xiàn)請求的處理和響應的返回,需要的朋友可以參考下2023-10-10

