Mybatis-Plus批量添加或修改數(shù)據(jù)的3種方式總結(jié)
SpringBoot批量添加或修改數(shù)據(jù)的三種方式
方式一.Mybatis-plus 提供的 saveOrUpdateBatch
提供的方法 是遍歷每一個(gè)元素,判斷主鍵是否存在,如果存在則做更新,不存在添加
方式二.分組數(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特有的語(yǔ)法,如下圖所示,表中id 為主鍵
再插入id為1的數(shù)據(jù),則提示主鍵已存在
改成如下SQL,則當(dāng)主鍵重復(fù)時(shí),將更新 字段 name 的值
INSERT into provider values (1,'w') ON DUPLICATE KEY UPDATE `name` = 'w';
因此我們可以編寫(xiě)如下的XML映射語(yǔ)句
insert into 表名 (需插入的字段) values <foreach collection="list" item="item" index="index" separator=","> #插入的數(shù)據(jù) </foreach> ON DUPLICATE KEY UPDATE # 當(dāng)主鍵重復(fù)時(shí),需要更新的字段以及對(duì)應(yīng)的數(shù)據(jù) 字段名1=VALUES(字段名1), 字段名2 =VALUES(字段名2) ......
補(bǔ)充:不使用Mybatis-plus進(jìn)行批量操作
有時(shí)候項(xiàng)目里沒(méi)有引用Mybatis-plus,但是也想進(jìn)行批量操作,數(shù)據(jù)量大了后foreach循環(huán)會(huì)影響性能。所以可以參考Mybatis-plus的批量操作,編寫(xiě)在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++; } // 非事務(wù)環(huán)境下強(qiáng)制commit,事務(wù)情況下該commit相當(dāng)于無(wú)效 batchSqlSession.commit(!TransactionSynchronizationManager.isSynchronizationActive()); return true; } catch (Exception e) { batchSqlSession.rollback(); throw new RuntimeException(e); } finally { batchSqlSession.close(); } } }
總結(jié)
到此這篇關(guān)于Mybatis-Plus批量添加或修改數(shù)據(jù)的3種方式的文章就介紹到這了,更多相關(guān)Mybatis-Plus批量添加修改數(shù)據(jù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
IntelliJ IDEA創(chuàng)建maven web項(xiàng)目的圖文步驟(IDEA新手適用)
這篇文章主要介紹了IntelliJ IDEA創(chuàng)建maven web項(xiàng)目的圖文步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03利用ScriptEngineManager實(shí)現(xiàn)字符串公式靈活計(jì)算的方法
今天小編就為大家分享一篇利用ScriptEngineManager實(shí)現(xiàn)字符串公式靈活計(jì)算的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07RedisTemplate.opsForHash()用法簡(jiǎn)介并舉例說(shuō)明
redistemplate.opsforhash是RedisTemplate模板類中的一個(gè)方法,用于獲取操作哈希數(shù)據(jù)類型的接口,這篇文章主要給大家介紹了關(guān)于RedisTemplate.opsForHash()用法簡(jiǎn)介并舉例說(shuō)明的相關(guān)資料,需要的朋友可以參考下2024-06-06Spring?Boot緩存實(shí)戰(zhàn)之Redis?設(shè)置有效時(shí)間和自動(dòng)刷新緩存功能(時(shí)間支持在配置文件中配置)
這篇文章主要介紹了Spring?Boot緩存實(shí)戰(zhàn)?Redis?設(shè)置有效時(shí)間和自動(dòng)刷新緩存,時(shí)間支持在配置文件中配置,需要的朋友可以參考下2023-05-05java中動(dòng)態(tài)代理的實(shí)現(xiàn)
本篇文章主要介紹了Java中兩種動(dòng)態(tài)代理的實(shí)現(xiàn):jdk動(dòng)態(tài)代理;cglib動(dòng)態(tài)代理。具有一定的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-01-01Java實(shí)現(xiàn)分解任意輸入數(shù)的質(zhì)因數(shù)算法示例
這篇文章主要介紹了Java實(shí)現(xiàn)分解任意輸入數(shù)的質(zhì)因數(shù)算法,涉及java數(shù)學(xué)運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下2017-10-10SpringBoot對(duì)靜態(tài)資源的映射規(guī)則詳解解讀
這篇文章主要介紹了SpringBoot對(duì)靜態(tài)資源的映射規(guī)則詳解解讀,在Spring Boot中,映射規(guī)則是用來(lái)定義URL與控制器方法之間的映射關(guān)系的,通過(guò)映射規(guī)則,可以將特定的URL請(qǐng)求映射到相應(yīng)的控制器方法上,從而實(shí)現(xiàn)請(qǐng)求的處理和響應(yīng)的返回,需要的朋友可以參考下2023-10-10IDEA報(bào)錯(cuò):java:無(wú)效的源發(fā)行版21解決方式
這篇文章主要給大家介紹了關(guān)于IDEA報(bào)錯(cuò):java:無(wú)效的源發(fā)行版21的解決方式,這個(gè)錯(cuò)誤是因?yàn)槟愕捻?xiàng)目使用的Java版本與你的IDEA使用的Java版本不一致導(dǎo)致的,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2024-06-06