mybatis-plus 根據指定字段 批量 刪除/修改

mybatis-plus 提供了根據id批量更新和修改的方法,這個大家都不陌生 但是當表沒有id的時候怎么辦

  • 方案一: 手寫SQL
  • 方案二: 手動獲取SqlSessionTemplate 就是把mybatis plus 干的事自己干了
  • 方案三 : 重寫 executeBatch 方法
  • 結論:

mybatis-plus 提供了根據id批量更新和修改的方法,這個大家都不陌生 但是當表沒有id的時候怎么辦)

方案一: 手寫SQL

  • 這個就不說了,就是因為不想手寫SQL 所以才有這篇博客

方案二: 手動獲取SqlSessionTemplate 就是把mybatis plus 干的事自己干了

// 這種方法就是把mybatis的活在干一遍,還是一條一條處理的.只是共用一個session連接
@Autowired
private SqlSessionTemplate sqlSessionTemplate;// 新獲取一個模式為BATCH,自動提交為false的session
SqlSession session = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH,false);
static final BATCH_SIZE = 1000;
// XxxMapper 為 對應的mapper文件
XxxMapper xxMapper = session.getMapper(XxxMapper.class);
int size = updateList.size();
try {for(int i=0; i < size; i++) {// updateByXxx 寫好的單條數據的方法xxMapper.updateByXxx(updateList.get(i));if(i % BATCH_SIZE == 0 || i == size-1){//手動每1000個一提交,提交后無法回滾session.commit();//清理緩存,防止溢出session.clearCache();}}
}catch (Exception e) {session.rollback();
} finally {session.close();
}

方案三 : 重寫 executeBatch 方法

	// mybatis plus 源碼@Transactional(rollbackFor = Exception.class)@Overridepublic 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);});}
  • mybatis plus 的 executeBatch
    在這里插入圖片描述
  • 參考 mybatis plus 的updateBatchById 方法.
  • 調用處:
//刪除方法 deleteList  是要刪除的主鍵list
List<String> deleteList = new ArrayList<>();
dao.batchDelete(deleteList, delete -> new QueryWrapper<String>().eq("xx", delete));// 修改方法 OBJ 代碼表對象
List<OBJ> updateList = new ArrayList<>();
dao.batchUpdate(updateList, update -> new LambdaQueryWrapper<OBJ>().eq(OBJ::getProductId, update.getProductId()));
  • 接口
    boolean batchUpdate(List<OBJ> updateList, Function<OBJ, LambdaQueryWrapper> queryWrapperFunction);boolean batchDelete(List<String> deleteList, Function<String, QueryWrapper> queryWrapperFunction);
  • 重寫方法 實現
	@Overridepublic boolean batchUpdate(List<OBJ> entityList, Function<OBJ, LambdaQueryWrapper> function) {return this.executeBatch(entityList, DEFAULT_BATCH_SIZE, (sqlSession, entity) -> {ParamMap param = new ParamMap();param.put(Constants.ENTITY, entity);param.put(Constants.WRAPPER, function.apply(entity));sqlSession.update(this.getSqlStatement(SqlMethod.UPDATE), param);});}@Overridepublic boolean batchDelete(List<String> deleteList, Function<String, QueryWrapper> function) {return this.executeBatch(deleteList, DEFAULT_BATCH_SIZE, (sqlSession, entity) -> {ParamMap param = new ParamMap();param.put(Constants.ENTITY, entity);param.put(Constants.WRAPPER, function.apply(entity));sqlSession.delete(this.getSqlStatement(SqlMethod.DELETE), param);});}

結論:

  • 這種寫法其實批量的效率還是比較慢的,如果對性能沒有要求,并且還不想手寫SQL的,可以試一試.

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/38859.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/38859.shtml
英文地址,請注明出處:http://en.pswp.cn/news/38859.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python jupyter lab 設置

在下載好jupyter lab 后&#xff0c;需要對其進行設置&#xff0c;尤其是遠程服務器的時候&#xff0c;因為根本就是沒有屏幕&#xff0c;也沒有瀏覽器。 新建設置文件 jupyter lab --generate-config設置文件內部參數 vim ~/.jupyter/jupyter_lab_config.py進去一通改&#…

網絡編程(8.15)io模型,IO多路復用(select,poll)

1.使用select函數實現IO多路復用 使用select函數實現IO多路復用的服務器&#xff1a; #include<stdio.h> #include<head.h> #include<netinet/in.h> #include<sys/select.h> #include<arpa/inet.h> #define PROT 1112 #define IP "192.16…

29 | 廣州美食店鋪數據分析

廣州美食店鋪數據分析 一、數據分析項目MVP加/價值主張宣言 隨著經濟的快速發展以及新媒體的興起,美食攻略、美食探店等一系列東西進入大眾的眼球,而人們也會在各大平臺中查找美食推薦,因此本項目做的美食店鋪數據分析也是帶有可行性的。首先通過對廣東省的各市美食店鋪數量…

對話即數據分析,網易數帆ChatBI做到了

大數據產業創新服務媒體 ——聚焦數據 改變商業 在當今數字化快速發展的時代&#xff0c;數據已經成為業務經營與管理決策的核心驅要素。無論是跨國大企業還是新興創業公司&#xff0c;正確、迅速地洞察數據已經變得至關重要。然而&#xff0c;傳統的BI工具往往對用戶有一定的…

初步認識OSI/TCP/IP一(第三十八課)

1 初始OSI模型 OSI參考模型(Open Systems Interconnection Reference Model)是一個由國際標準化組織(ISO)和國際電報電話咨詢委員會(CCITT)聯合制定的網絡通信協議規范,它將網絡通信分為七個不同的層次,每個層次負責不同的功能和任務。 2 網絡功能 數據通信、資源共享…

MTK Android非常用分辨率修改充電動畫

非標準分辨率的屏,配置MTK Android的關機充電動畫. 環境 芯片 MTK 系統 Android 服務器 ubuntu 屏幕分辨率356*400,不是常見的分辨率. 原始充電動畫顯示異常,畫面扭曲. 方法 確定使用的圖片 vendor/mediatek/proprietary/bootable/bootloader/lk/dev/logo 這個目錄下…

springboot多模塊打包方式

明確子父模塊結構 父目錄是帶modules 大致結構如下&#xff1a; <modules><module>ruoyi-admin</module><module>ruoyi-framework</module><module>ruoyi-system</module><module>ruoyi-quartz</module><module>…

htmlCSS-----高級選擇器

目錄 前言 偽類選擇器 狀態類 結構類 偽元素選擇器 屬性選擇器 前言 前面我們學習了CSS中的相關選擇器&#xff08;鏈接html&CSS-----CSS選擇器&#xff08;上&#xff09;_灰勒塔德的博客-CSDN博客 html&CSS-----CSS選擇器&#xff08;下&#xff09;_灰勒塔…

計算機視覺中的Transformer

幾十年來&#xff0c;理論物理學家一直在努力提出一個宏大的統一理論。通過統一&#xff0c;指的是將被認為是完全不同的兩個或多個想法結合起來&#xff0c;將它們的不同方面證明為同一基礎現象。一個例子是在19世紀之前&#xff0c;電和磁被看作是無關的現象&#xff0c;但電…

基于java的汽車改裝方案網站設計與實現

摘要 本文主要講述了基于SpringBootMySql開發技術開發的汽車改裝方案網站的設計與實現。這里的汽車改裝方案網站是通過一個平臺使所有的汽車愛好者們可以不用出門就可以體驗到專業的汽車改裝方案設計服務。現實生活中如果需要進行汽車改裝的方案設計&#xff0c;往往要跑很多次…

【大數據之Kafka】三、Kafka生產者之消息發送流程及同步異步發送API

將外部傳送給過來的數據發送到kafka集群。 1 發送原理 &#xff08;1&#xff09;創建main()線程&#xff0c;創建producer對象&#xff0c;調用send方法&#xff0c;經過攔截器&#xff08;可選&#xff09;、序列化器、分區器。 &#xff08;2&#xff09;分區器將數據發送…

【Android Framework (十二) 】- 智能硬件設備開發

文章目錄 前言智能硬件的定義與應用智能硬件產品開發流程智能硬件開發所涉及的技術體系概述關于主板選型主板CPU芯片的選擇關于串口通信 總結 前言 針對我過往工作經歷&#xff0c;曾在一家智能科技任職Android開發工程師&#xff0c;簡單介紹下關于任職期間接觸和開發過的一些…

DDPM: Denoising Diffusion Probabilistic Models

DDPM: Denoising Diffusion Probabilistic Models 去噪擴散模型前向過程-加噪聲反向過程-去噪聲 去噪擴散模型 論文題目&#xff1a;Denoising Diffusion Probabilistic Models (DDPM) 論文來源&#xff1a;NIPS, 2020 論文地址&#xff1a;https://arxiv.org/abs/2006.11239 論…

RH850從0搭建Autosar開發環境【24】- Davinci Configurator之DEM模塊配置詳解(上)

DEM模塊配置詳解 - 上 一、Autosar中DEM模塊簡介1.DEM對其他模塊的依賴2.DEM模塊架構2.1 DEM模塊Dem Satellite(s) 和Master2.2 診斷事件處理2.2.1 基于計數器的算法2.2.2 基于時間的算法三、配置錯誤項處理3.1 容器DemEventParameter3.2 容器DemOperationCycleRef3.3 容器DemO…

13.3 目標檢測和邊界框

錨框的計算公式 假設原圖的高為H,寬為W 詳細公式推導 以同一個像素點為錨框&#xff0c;可以生成 (n個縮放 m個寬高比 -1 )個錨框 錨框的作用&#xff1a; 不用直接去預測真實框的四個坐標&#xff0c;而是&#xff1a; 1.先生成多個錨框。 2.預測每個錨框里是否含有要預測…

C++:哈希表——模擬散列表

模擬散列表 維護一個集合&#xff0c;支持如下幾種操作&#xff1a; 1.“I x”&#xff0c;插入一個數x 2.“Q x”&#xff0c;詢問數x是否在集合中出現過 現在要進行N次操作&#xff0c;對于每個詢問操作輸出對應的結果 輸入格式 第一行包含整數N&#xff0c;表示操作數量 …

【Linux】【驅動】雜項設備驅動

【Linux】【驅動】雜項設備驅動 Linux三大設備驅動1. 我們這節課要講的雜項設備驅動是屬于我們這三大設備驅動里面的哪個呢?2.雜項設備除了比字符設備代碼簡單&#xff0c;還有別的區別嗎?3.主設備號和次設備號是什么? 掛載驅動 雜項設備驅動是字符設備驅動的一種&#xff0…

小程序制作教程:從零開始搭建企業小程序

在如今的數字化時代&#xff0c;企業介紹小程序成為了企業展示與推廣的重要工具。通過企業介紹小程序&#xff0c;企業可以向用戶展示自己的品牌形象、產品服務以及企業文化等內容&#xff0c;進而提高用戶對企業的認知度和信任度。本文將介紹如何從零開始搭建一個企業介紹小程…

Linux常用命令詳細大全

目錄 1、查看目錄與文件&#xff1a;ls2、切換目錄&#xff1a;cd3、顯示當前目錄&#xff1a;pwd4、創建空文件&#xff1a;touch5、創建目錄&#xff1a;mkdir6、查看文件內容&#xff1a;cat7、分頁查看文件內容&#xff1a;more8、查看文件尾內容&#xff1a;tail9、拷貝&a…

小程序 vant 項目記錄總結 使用 scss 分享 訂閱消息 wxs 分包 echarts圖表 canvas getCurrentPages頁面棧

小程序 vant vant 下載 npm init -ynpm i vant/weapp -S --production修改 app.json 將 app.json 中的 “style”: “v2” 去除 修改 project.config.json {..."setting": {..."packNpmManually": true,"packNpmRelationList": [{"p…