国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Mybatis-plus批量操作

這篇具有很好參考價(jià)值的文章主要介紹了Mybatis-plus批量操作。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

前言

? ? ? ? 使用Mybatis-plus可以很方便的實(shí)現(xiàn)批量新增和批量修改,不僅比自己寫foreach遍歷方便很多,而且性能也更加優(yōu)秀。但是Mybatis-plus官方提供的批量修改和批量新增都是根據(jù)id來修改的,有時(shí)候我們需求其他字段,所以就需要我們自己修改一下。

一、批量修改

? ? ? ? 在Mybatis-plus的IService接口中有updateBatchById方法,我們常用以下方法根據(jù)id批量修改數(shù)據(jù)。

    @Transactional(rollbackFor = Exception.class)
    default boolean updateBatchById(Collection<T> entityList) {
        return updateBatchById(entityList, DEFAULT_BATCH_SIZE);
    }

    @Transactional(rollbackFor = Exception.class)
    @Override
    public boolean updateBatchById(Collection<T> entityList, int batchSize) {
        String sqlStatement = getSqlStatement(SqlMethod.UPDATE_BY_ID);
        return executeBatch(entityList, batchSize, (sqlSession, entity) -> {
            MapperMethod.ParamMap<T> param = new MapperMethod.ParamMap<>();
            param.put(Constants.ENTITY, entity);
            sqlSession.update(sqlStatement, param);
        });
    }

但是當(dāng)我們想根據(jù)其他字段批量修改數(shù)據(jù)時(shí),該方法就無能為力了。所以我們就可以根據(jù)第二個(gè)updateBatchById方法在自己的service類里面寫一個(gè)新的批量新增方法。

    public boolean updateBatchByColumn(Collection<?> entityList, String idCard) {
        String sqlStatement = getSqlStatement(SqlMethod.UPDATE);
        return executeBatch(entityList, (sqlSession, entity) -> {
            LambdaUpdateWrapper<SysUser> updateWrapper = Wrappers.<SysUser>lambdaUpdate()
                    .eq(SysUser::getIdCard, idCard);
            Map<String, Object> param = CollectionUtils.newHashMapWithExpectedSize(2);
            param.put(Constants.ENTITY, entity);
            param.put(Constants.WRAPPER, updateWrapper);
            sqlSession.update(sqlStatement, param);
        });
    }

注意sqlStatement是使用的SqlMethod.UPDATE,SysUser對(duì)象是舉例,使用的是若依的用戶數(shù)據(jù)。

二、批量新增或修改

? ? ? ? 在Mybatis-plus的ServiceImpl 類中有一個(gè)saveOrUpdateBatch 方法用于批量新增或修改,通過CollectionUtils.isEmpty(sqlSession.selectList(getSqlStatement(SqlMethod.SELECT_BY_ID), entity))根據(jù)id查詢數(shù)據(jù)是否已存在,不存在新增,存在則修改,源碼如下:

    @Transactional(rollbackFor = Exception.class)
    @Override
    public boolean saveOrUpdateBatch(Collection<T> entityList, int batchSize) {
        TableInfo tableInfo = TableInfoHelper.getTableInfo(entityClass);
        Assert.notNull(tableInfo, "error: can not execute. because can not find cache of TableInfo for entity!");
        String keyProperty = tableInfo.getKeyProperty();
        Assert.notEmpty(keyProperty, "error: can not execute. because can not find column for id from entity!");
        return SqlHelper.saveOrUpdateBatch(this.entityClass, this.mapperClass, this.log, entityList, batchSize, (sqlSession, entity) -> {
            Object idVal = tableInfo.getPropertyValue(entity, keyProperty);
            return StringUtils.checkValNull(idVal)
                || CollectionUtils.isEmpty(sqlSession.selectList(getSqlStatement(SqlMethod.SELECT_BY_ID), entity));
        }, (sqlSession, entity) -> {
            MapperMethod.ParamMap<T> param = new MapperMethod.ParamMap<>();
            param.put(Constants.ENTITY, entity);
            sqlSession.update(getSqlStatement(SqlMethod.UPDATE_BY_ID), param);
        });
    }

最終調(diào)用的是SqlHelper.saveOrUpdateBatch方法,該方法第六個(gè)參數(shù)是BiPredicate,這就是用于判斷數(shù)據(jù)庫中數(shù)據(jù)是否存在的關(guān)鍵,所以我們需要修改這個(gè)函數(shù)式接口,修改為根據(jù)其他條件查詢數(shù)據(jù)庫。該方法的第七個(gè)參數(shù)是BiConsumer,該函數(shù)式接口用于修改數(shù)據(jù),如果不想根據(jù)id修改數(shù)據(jù),可以參考第一部門進(jìn)行修改。

    @Transactional(rollbackFor = Exception.class)
    public boolean saveOrUpdateBatchByColumn(Collection<?> entityList, String idCard) {

        return SqlHelper.saveOrUpdateBatch(this.entityClass, this.mapperClass, super.log, entityList, DEFAULT_BATCH_SIZE, (sqlSession, entity) -> {
            LambdaQueryWrapper<SysUser> queryWrapper = Wrappers.<SysUser>lambdaQuery()
                    .eq(SysUser::getIdCard, idCard);
            Map<String, Object> map = CollectionUtils.newHashMapWithExpectedSize(1);
            map.put(Constants.WRAPPER, queryWrapper);
            return CollectionUtils.isEmpty(sqlSession.selectList(getSqlStatement(SqlMethod.SELECT_LIST), map));
        }, (sqlSession, entity) -> {
            Map<String, Object> param = CollectionUtils.newHashMapWithExpectedSize(2);
            param.put(Constants.ENTITY, entity);
            sqlSession.update(getSqlStatement(SqlMethod.UPDATE_BY_ID), param);
        });
    }

三、不使用Mybatis-plus進(jìn)行批量操作

? ? ? ? 有時(shí)候項(xiàng)目里沒有引用Mybatis-plus,但是也想進(jìn)行批量操作,數(shù)據(jù)量大了后foreach循環(huán)會(huì)影響性能。所以可以參考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++;
            }
            // 非事務(wù)環(huán)境下強(qiáng)制commit,事務(wù)情況下該commit相當(dāng)于無效
            batchSqlSession.commit(!TransactionSynchronizationManager.isSynchronizationActive());
            return true;
        } catch (Exception e) {
            batchSqlSession.rollback();
            throw new RuntimeException(e);
        } finally {
            batchSqlSession.close();
        }
    }
}

寫在最后的話

? ? ? ? Mybatis-plus真好用,少寫好多代碼。有些不太適用的方法,也可以很簡(jiǎn)單在官方的基礎(chǔ)上進(jìn)行擴(kuò)展。文章來源地址http://www.zghlxwxcb.cn/news/detail-678320.html

到了這里,關(guān)于Mybatis-plus批量操作的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Mybatis-plus的操作(新增,修改)

    一般同時(shí)會(huì)引入Druid。 MP會(huì)默認(rèn)將模型類的類名首字母小寫作為表名使用,假如數(shù)據(jù)庫名稱都以tbl_開頭,那么我們就需要將所有的模型類上添加@TableName,配置起來還是比較繁瑣,簡(jiǎn)化方式可以在配置文件中配置如下內(nèi)容: 設(shè)置前綴的內(nèi)容,這樣MP就會(huì)拿tbl_加上模型類的首字

    2024年02月02日
    瀏覽(43)
  • Mybatis-Plus批量更新原理

    Mybatis-Plus批量更新原理

    IService的updateBatchById方法 默認(rèn)batchSize = 1000 com.baomidou.mybatisplus.extension.service.impl.ServiceImpl#updateBatchById 構(gòu)建了一個(gè)回調(diào),進(jìn)入executeBatch方法 在這個(gè)方法基本就能看出來了,執(zhí)行1000次方法后執(zhí)行一次flushStatements,也就是說理論上是積累了1000個(gè)更新sql,才進(jìn)行一次數(shù)據(jù)庫更新 使用

    2024年02月05日
    瀏覽(20)
  • Mybatis-plus---的批量插入

    Mybatis-plus---的批量插入

    批量插入 一、繼承IService(偽批量) 二、insertBatchSomeColumn Mybatis-plus很強(qiáng),為我們誕生了極簡(jiǎn)CURD操作,但對(duì)于數(shù)據(jù)批量操作,顯然默認(rèn)提供的insert方法是不夠看的了,于是它和它來了!!! Mybatis-plus提供的兩種插入方式 ?????? ??繼承IService(偽批量) ????????insertBatchSo

    2024年02月16日
    瀏覽(21)
  • mybatis-plus 批量插入示例

    mybatis-plus 批量插入示例

    正常我們使用mybatis-plus插入的時(shí)候,首先想到的是??saveBatch?方法,不過看了下打印出來的sql和底層代碼,才發(fā)現(xiàn)它并不是真正的批量插入。 ? ? 實(shí)現(xiàn)層? ?ServiceImpl?中的代碼為 通過監(jiān)控控制臺(tái)發(fā)現(xiàn),它只是循環(huán)每1000條去插入,效率非常低。 ? 參考網(wǎng)友的文章,找到一個(gè)支

    2024年02月15日
    瀏覽(24)
  • mybatis-plus的批量新增insertBatchSomeColumn

    mybatis-plus的批量新增insertBatchSomeColumn

    MyBatis-Plus 是基于 MyBatis 進(jìn)行封裝的一套優(yōu)秀的持久層框架,它提供了豐富的便捷操作方法和強(qiáng)大的代碼生成器,大大簡(jiǎn)化了 MyBatis 的使用。在 MyBatis-Plus 中,我們可以使用 insertBatchSomeColumn 方法來實(shí)現(xiàn)批量新增指定字段的操作。 mybatis-plus 的? IService 接口? 默認(rèn)提供 ? saveBat

    2024年02月01日
    瀏覽(17)
  • 批量插入或更新數(shù)據(jù)(MyBatis-plus框架)

    批量插入或更新數(shù)據(jù)(MyBatis-plus框架)

    目錄 1.場(chǎng)景說明 2.DUPLICATE?和REPLACE比較 3.批量插入或者更新(兩種方式) 方式一:mybatis-plus的saveOrUpdateBatch方法 問題:如果操作類集成了基礎(chǔ)類,比如封裝了BaseEntity去集成,那么這樣使用會(huì)出問題 方式二:on duplicate key (推薦) 4.注意 5.常見問題? 插入數(shù)據(jù)時(shí),我們經(jīng)常會(huì)遇到這

    2024年02月04日
    瀏覽(24)
  • mybatis-plus批量保存異常及效率優(yōu)化

    mybatis-plus批量保存異常及效率優(yōu)化

    最近基于自己公司內(nèi)部服務(wù)維護(hù),發(fā)現(xiàn)其中調(diào)度中心近期出現(xiàn)不少錯(cuò)誤日志,但是該任務(wù)卻是正常執(zhí)行,生成的報(bào)表數(shù)據(jù)也是正常的,所以很多天沒有發(fā)現(xiàn)問題 這就匪夷所思了, ? ?經(jīng)仔細(xì)排查發(fā)現(xiàn),是觸發(fā)了feign超時(shí)hystrix熔斷器機(jī)制 也就是說子服務(wù)出現(xiàn)了執(zhí)行時(shí)間過長(zhǎng)的

    2024年01月16日
    瀏覽(22)
  • MyBatis-plus的批量插入方式對(duì)比分析

    ??【摘要】Mybatis批量插入一直是開發(fā)者重點(diǎn)關(guān)注的問題,本文列舉了Mybatis的五種插入方式進(jìn)行對(duì)比分析,驗(yàn)證了五種批量插入的方式的優(yōu)先級(jí)。 ??略。 1、編寫UserService服務(wù)類,測(cè)試一萬條數(shù)據(jù)的耗時(shí)情況: 2、編寫UserMapper接口 3、編寫UserMapper.xml文件 4、進(jìn)行單元測(cè)試

    2024年02月07日
    瀏覽(24)
  • spring boot集成mybatis-plus——Mybatis Plus 批量 Insert_新增數(shù)據(jù)(圖文講解)

    spring boot集成mybatis-plus——Mybatis Plus 批量 Insert_新增數(shù)據(jù)(圖文講解)

    ?更新時(shí)間 2023-01-10 16:02:58 大家好,我是小哈。 本小節(jié)中,我們將學(xué)習(xí)如何通過 Mybatis Plus 實(shí)現(xiàn) MySQL 批量插入數(shù)據(jù)。 先拋出一個(gè)問題:假設(shè)老板給你下了個(gè)任務(wù),向數(shù)據(jù)庫中添加 100 萬條數(shù)據(jù),并且不能耗時(shí)太久! 通常來說,我們向 MySQL 中新增一條記錄,SQL 語句類似如下:

    2024年02月04日
    瀏覽(28)
  • Mybatis-plus通過其他字段批量更新或新增

    根據(jù)某個(gè)或者多個(gè)非ID字段進(jìn)行批量更新 示例通過名稱與id兩個(gè)字段更新 引用mybatis-plus根據(jù)某個(gè)指定字段批量更新數(shù)據(jù)庫 通過其他字段批量更新或新增

    2024年02月12日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包