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-07RedisTemplate.opsForHash()用法簡介并舉例說明
redistemplate.opsforhash是RedisTemplate模板類中的一個方法,用于獲取操作哈希數(shù)據(jù)類型的接口,這篇文章主要給大家介紹了關于RedisTemplate.opsForHash()用法簡介并舉例說明的相關資料,需要的朋友可以參考下2024-06-06Spring?Boot緩存實戰(zhàn)之Redis?設置有效時間和自動刷新緩存功能(時間支持在配置文件中配置)
這篇文章主要介紹了Spring?Boot緩存實戰(zhàn)?Redis?設置有效時間和自動刷新緩存,時間支持在配置文件中配置,需要的朋友可以參考下2023-05-05Java實現(xiàn)分解任意輸入數(shù)的質因數(shù)算法示例
這篇文章主要介紹了Java實現(xiàn)分解任意輸入數(shù)的質因數(shù)算法,涉及java數(shù)學運算相關操作技巧,需要的朋友可以參考下2017-10-10SpringBoot對靜態(tài)資源的映射規(guī)則詳解解讀
這篇文章主要介紹了SpringBoot對靜態(tài)資源的映射規(guī)則詳解解讀,在Spring Boot中,映射規(guī)則是用來定義URL與控制器方法之間的映射關系的,通過映射規(guī)則,可以將特定的URL請求映射到相應的控制器方法上,從而實現(xiàn)請求的處理和響應的返回,需要的朋友可以參考下2023-10-10