欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Mybatis-Plus批量添加或修改數(shù)據(jù)的3種方式總結(jié)

 更新時(shí)間:2023年05月22日 10:13:43   作者:秋日的晚霞  
使用Mybatis-plus可以很方便的實(shí)現(xiàn)批量新增和批量修改,不僅比自己寫(xiě)foreach遍歷方便很多,而且性能也更加優(yōu)秀,下面這篇文章主要給大家介紹了關(guān)于Mybatis-Plus批量添加或修改數(shù)據(jù)的3種方式,需要的朋友可以參考下

SpringBoot批量添加或修改數(shù)據(jù)的三種方式

方式一.Mybatis-plus 提供的 saveOrUpdateBatch

提供的方法 是遍歷每一個(gè)元素,判斷主鍵是否存在,如果存在則做更新,不存在添加

image-20230411142159127

image-20230411142521452

方式二.分組數(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 為主鍵

image-20230411150035835

再插入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)文章

最新評(píng)論