最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

mybatis-plus根據(jù)任意字段saveOrUpdateBatch更新插入的方法實(shí)現(xiàn)

 更新時(shí)間:2026年04月02日 10:14:41   作者:凱醬  
Iservice接口下的saveOrUpdateBatch方法默認(rèn)是根據(jù)主鍵來決定是要更新還是插入的,本文就來詳細(xì)的介紹一下saveOrUpdateBatch的使用,感興趣的可以來了解一下

mybatisplus Iservice接口下的saveOrUpdateBatch方法默認(rèn)是根據(jù)主鍵來決定是要更新還是插入的,如果要根據(jù)其他字段(必須是唯一約束,唯一約束字段可以是多個(gè))更新的話,則需要在項(xiàng)目的service層重寫該方法。

方法源碼

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

從源碼中可以看出實(shí)現(xiàn)saveOrUpdateBatch的主要方法就是SqlHelper.saveOrUpdateBatch

public static <E> boolean saveOrUpdateBatch(Class<?> entityClass, Class<?> mapper, Log log, Collection<E> list, int batchSize, BiPredicate<SqlSession, E> predicate, BiConsumer<SqlSession, E> consumer) {
        String sqlStatement = getSqlStatement(mapper, SqlMethod.INSERT_ONE);
        return executeBatch(entityClass, log, list, batchSize, (sqlSession, entity) -> {
            if (predicate.test(sqlSession, entity)) {
                sqlSession.insert(sqlStatement, entity);
            } else {
                consumer.accept(sqlSession, entity);
            }
        });
    }

該方法的最后兩個(gè)參數(shù)predicate,consumer
predicate 這個(gè)函數(shù)是用于判斷是否要進(jìn)行插入操作 true插入,false:則通過consumer 函數(shù)執(zhí)行更新

方法改造

注意:寫在項(xiàng)目操作對(duì)應(yīng)表的service層
首先在service層定義接口

boolean saveOrUpdateBatchByAgentIdAndPeriodAndType(List<Entity> list);

類為數(shù)據(jù)庫表對(duì)應(yīng)的實(shí)體類 ,agentId,period,type,這個(gè)三個(gè)字段為表的唯一約束,即當(dāng)表中存在這三個(gè)字段組合對(duì)應(yīng)的記錄時(shí)則進(jìn)行更新操作,不存在則進(jìn)行插入操作
service層接口實(shí)現(xiàn)

@Transactional(rollbackFor = Exception.class)
    @DS("XXXX")//如果為多數(shù)據(jù)源,這里要指明具體操作的數(shù)據(jù)源名稱
    public boolean saveOrUpdateBatchByAgentIdAndPeriodAndType(List<Entity> list) {
        return SqlHelper.saveOrUpdateBatch(entityClass, this.mapperClass, super.log, list, DEFAULT_BATCH_SIZE, (sqlSession, entity) -> {//這里主要是查詢唯一約束對(duì)應(yīng)的記錄是否存在
            LambdaQueryWrapper<Entity> queryWrapper = Wrappers.<Entity>lambdaQuery()
                    .eq(Entity::getAgentId, entity.getAgentId()).eq(Entity::getPeriod,entity.getPeriod())
                    .eq(Entity::getType,entity.getType());
            Map<String, Object> map = CollectionUtils.newHashMapWithExpectedSize(1);
            map.put(Constants.WRAPPER, queryWrapper);
            return CollectionUtils.isEmpty(sqlSession.selectList(getSqlStatement(SqlMethod.SELECT_LIST), map));
        }, (sqlSession, entity) -> {
            LambdaUpdateWrapper<Entity> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
            lambdaUpdateWrapper.eq(Entity::getAgentId, entity.getAgentId()).eq(Entity::getPeriod,entity.getPeriod())
                    .eq(Entity::getType,entity.getType());
            Map<String, Object> param = CollectionUtils.newHashMapWithExpectedSize(2);
            param.put(Constants.ENTITY, entity);
            param.put(Constants.WRAPPER, lambdaUpdateWrapper);
            sqlSession.update(getSqlStatement(SqlMethod.UPDATE), param);
        });
    }

非批量的saveOrUpdate也可以按照這種方式進(jìn)行改造

到此這篇關(guān)于mybatis-plus根據(jù)任意字段saveOrUpdateBatch更新插入的方法實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)mybatis-plus saveOrUpdateBatch內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java String不可變性實(shí)現(xiàn)原理解析

    Java String不可變性實(shí)現(xiàn)原理解析

    這篇文章主要介紹了Java String不可變性實(shí)現(xiàn)原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • JAVA學(xué)習(xí)進(jìn)階篇之時(shí)間與日期相關(guān)類

    JAVA學(xué)習(xí)進(jìn)階篇之時(shí)間與日期相關(guān)類

    在日常的開發(fā)工作當(dāng)中,我們經(jīng)常需要用到日期相關(guān)的類,下面這篇文章主要給大家介紹了關(guān)于JAVA學(xué)習(xí)進(jìn)階篇之時(shí)間與日期相關(guān)類的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • java客戶端線上Apollo服務(wù)端的實(shí)現(xiàn)

    java客戶端線上Apollo服務(wù)端的實(shí)現(xiàn)

    這篇文章主要介紹了java客戶端線上Apollo服務(wù)端的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • Spring MVC接口防數(shù)據(jù)篡改和重復(fù)提交

    Spring MVC接口防數(shù)據(jù)篡改和重復(fù)提交

    這篇文章主要為大家詳細(xì)介紹了Spring MVC接口防數(shù)據(jù)篡改和重復(fù)提交,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • Spring?Boot?3.4.3?基于?Spring?WebFlux?實(shí)現(xiàn)?SSE?功能(代碼示例)

    Spring?Boot?3.4.3?基于?Spring?WebFlux?實(shí)現(xiàn)?SSE?功能(代碼示例)

    Spring Boot 3.4.3 結(jié)合Spring WebFlux實(shí)現(xiàn)SSE 功能,為實(shí)時(shí)數(shù)據(jù)推送提供了優(yōu)雅的解決方案,通過本文的步驟,你可以快速搭建一個(gè)基于事件驅(qū)動(dòng)的后端服務(wù),滿足實(shí)時(shí)通知或監(jiān)控等需求,感興趣的朋友一起看看吧
    2025-04-04
  • SpringBoot獲取真實(shí)客戶端IP的正確方法

    SpringBoot獲取真實(shí)客戶端IP的正確方法

    在日常開發(fā)中,獲取客戶端IP看似簡單,實(shí)則暗藏玄機(jī),很多開發(fā)者直接使用request.getRemoteAddr(),結(jié)果在生產(chǎn)環(huán)境中發(fā)現(xiàn)獲取到的都是負(fù)載均衡器的IP,而非真實(shí)用戶IP,本文將徹底揭秘Spring Boot中獲取真實(shí)客戶端IP的正確姿勢(shì),需要的朋友可以參考下
    2026-03-03
  • java跳出循環(huán)的方式匯總

    java跳出循環(huán)的方式匯總

    本文介紹了Java中三種常用的跳出循環(huán)的語句:break、continue和return,break用于完全結(jié)束循環(huán)并跳出循環(huán)體;continue用于跳過本次循環(huán)體中尚未執(zhí)行的語句,開始下一次循環(huán);return用于結(jié)束方法,每種方法給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧
    2025-02-02
  • SpringBoot依賴注入的詳細(xì)介紹、使用技巧

    SpringBoot依賴注入的詳細(xì)介紹、使用技巧

    在Spring Boot中,依賴注入是一項(xiàng)關(guān)鍵的特性,它通過容器來管理和注入應(yīng)用程序中的各種組件,本文介紹SpringBoot依賴注入的詳細(xì)介紹、使用技巧,感興趣的朋友一起看看吧
    2024-01-01
  • springboot在filter中如何用threadlocal存放用戶身份信息

    springboot在filter中如何用threadlocal存放用戶身份信息

    這篇文章主要介紹了springboot中在filter中如何用threadlocal存放用戶身份信息,本文章主要描述通過springboot的filter類,在過濾器中設(shè)置jwt信息進(jìn)行身份信息保存的方法,需要的朋友可以參考下
    2024-07-07
  • Elasticsearch 映射參數(shù)詳解 fields

    Elasticsearch 映射參數(shù)詳解 fields

    這篇文章主要介紹了fields Elasticsearch 映射參數(shù)fields,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07

最新評(píng)論

平定县| 瑞金市| 永济市| 彝良县| 富锦市| 永宁县| 师宗县| 平武县| 高密市| 嵩明县| 新郑市| 明光市| 自治县| 金坛市| 白河县| 资溪县| 内黄县| 射阳县| 安庆市| 瑞金市| 饶河县| 陵川县| 苏尼特右旗| 浦江县| 甘南县| 河东区| 翁牛特旗| 尤溪县| 婺源县| 南康市| 邹平县| 绥化市| 闸北区| 宿州市| 张家口市| 延寿县| 牟定县| 井冈山市| 油尖旺区| 寻乌县| 泸州市|