mybatis-plus 根据指定字段 批量 删除/修改

news2024/11/23 23:02:14

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)
    @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);
        });
    }
  • 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);
  • 重写方法 实现
	@Override
    public 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);
        });
    }

    @Override
    public 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.coloradmin.cn/o/877064.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

创建百度百科需要什么条件?

随着互联网的发展&#xff0c;人们越来越依赖于搜索引擎获取信息。百度作为中国最大的搜索引擎之一&#xff0c;旗下的百科词条已成为人们获取知识的重要来源。创建百度百科需要什么条件呢&#xff1f;接下来伯乐网络传媒就来给大家讲一讲。 首先&#xff0c;你需要有一个百度…

最小生成树(Kruskal)克鲁斯卡尔算法

算法步骤总共分为两步&#xff0c;由并查集实现 第一步&#xff08;把所有的边按边长的大小进行排序&#xff09; 第二步&#xff08;如果两个点不连通就把两点之间的边加上再把两个点连通&#xff09; 当放入的边数为点数减去一时就代表已经全部连通 例题一&#xff08;859. …

五、Dubbo 启停原理解析

五、Dubbo 启停原理解析 5.1 配置解析 5.1.1 基于 schema 设计解析 Dubbo 配置约束文件在 dubbo-config/dubbo-config-spring/src/main/resources/dubbo.xsd 中&#xff0c;dubbo.xsd 文件用来约束使用 XML 配置时的标签和对应的属性 5.1.2 基于 XML 配置原理解析 主要解…

优维低代码实践:自定义模板

优维低代码技术专栏&#xff0c;是一个全新的、技术为主的专栏&#xff0c;由优维技术委员会成员执笔&#xff0c;基于优维7年低代码技术研发及运维成果&#xff0c;主要介绍低代码相关的技术原理及架构逻辑&#xff0c;目的是给广大运维人提供一个技术交流与学习的平台。 优维…

threejs中gltf模型出现的问题(黑色,颜色不协调,太小)和解决方案

模型一片漆黑 如下图 可能原因&#xff0c;没有灯光&#xff0c;加下以下代码&#xff1a; // 4、加入灯光 const lightness new THREE.HemisphereLight(0xffffff, 0x444444); lightness.position.set(0, 20, 0); scene.add(lightness); const shadowLight new THREE.Direct…

20230814让惠普(HP)锐14 新AMD锐龙电脑不联网进WIN11进系统

20230814让惠普(HP)锐14 新AMD锐龙电脑不联网进WIN11进系统 2023/8/14 17:19 win11系统无法跳过联网 https://www.xpwin7.com/jiaocheng/28499.html Win11开机联网跳过不了怎么办&#xff1f;Win11开机联网跳过不了解决方法 Win11开机联网跳过不了怎么办&#xff1f;Win11开机…

gearman使用心得

gearman基础 工作原理 部署架构 本质上&#xff0c;gearman可以认为是一个分布式任务队列&#xff0c;client是生产者&#xff0c;worker则是消费者。gearman并不主动分发任务&#xff0c;而是由worker到它那里去取任务执行&#xff0c;所以它采用的是类似kafka的pull消费模式…

【Unity每日一记】向量操作摄像机的移动(向量加减)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;uni…

【JavaWeb】实训的长篇笔记(上)

JavaWeb的实训是学校的一门课程&#xff0c;老师先讲解一些基础知识&#xff0c;然后让我们自己开发一个比较简单的Web程序。可涉及的知识何其之多&#xff0c;不是实训课的 3 周时间可以讲得完的&#xff0c;只是快速带过。他说&#xff1a;重点是Web开发的流程。 我的实训草草…

c++虚继承(使用)

class A2:virtual public Grand 1.构造顺序按派生列表顺序&#xff0c;若有虚基类先构造虚基类&#xff0c;销毁顺序和构造顺序相反。 2.虚基类时&#xff0c;孙子C来初始化爷爷Grand。 附&#xff1a;thinking in c 2nd https://www.micc.unifi.it/bertini/download/progr…

【数据结构】 初识集合框架

文章目录 什么是集合框架集合框架的重要性开发中的使用笔试及面试题 数据结构是什么容器背后对应的数据结构相关java知识 什么是算法如何学好数据结构以及算法多画图多思考死磕代码多总结多刷题 总结 什么是集合框架 这里博主将简单介绍一下集合框架&#xff0c;想要详细了解的…

为什么需要知识图谱,如何构建它?

从关系数据库迁移到图形数据库的指南 跟随 发表于 迈向数据科学 7 分钟阅读 4天前 154 4 一、说明 TLDR&#xff1a;知识图谱在图数据库中组织事件、人员、资源和文档&#xff0c;以进行高级分析。本文将解释知识图谱的用途&#xff0c;并向您展示如何将关系数据模型转换为图…

【Sklearn】基于最中心分类器算法的数据分类预测(Excel可直接替换数据)

【Sklearn】基于最中心分类器算法的数据分类预测&#xff08;Excel可直接替换数据&#xff09; 1.模型原理2.模型参数3.文件结构4.Excel数据5.下载地址6.完整代码7.运行结果 1.模型原理 最近中心分类器&#xff08;Nearest Centroid Classifier&#xff09;也被称为近似最近邻…

SolidUI 一句话生成任何图形,v0.2.0功能介绍

文章目录 背景聊天窗口提示词 聊天窗口生成输入数据格式柱形图曲面图散点图螺旋线饼图兔子建模地图 设计页面页面布局预览 SolidUI社区的未来规划如何成为贡献者加群 背景 随着文本生成图像的语言模型兴起&#xff0c;SolidUI想帮人们快速构建可视化工具&#xff0c;可视化内容…

BFS(广度优先搜索) 的相关介绍解析

文章目录 DFS 和 BFSBFS 的应用一&#xff1a;层序遍历BFS 的应用二&#xff1a;最短路径最短路径例题讲解 DFS&#xff08;深度优先搜索&#xff09;和 BFS&#xff08;广度优先搜索&#xff09;就像孪生兄弟&#xff0c;提到一个总是想起另一个。然而在实际使用中&#xff0c…

Keburnetes 存储卷 volumes

K8S 的 存储卷 volumes emptyDir 可实现Pod中的容器之间共享目录数据&#xff0c;但emptyDir存储卷没有持久化数据的能力&#xff0c;存储卷会随着Pod生命周期结束而一起删除 &#xff08;一个pod中创建了docker1 docker2两个容器&#xff0c;他们都挂载这个emptyDir&#xff0…

第1期:《实体新零售--瑞幸咖啡》私域爆款案列拆解

朋友们&#xff0c;大家好&#xff0c;阿车写私域相关的内容也有一段时间了&#xff0c;前前后后也接触了不少“私域玩法” “爆款案列”&#xff0c;只是一直不知道怎么分享给大家&#xff0c;前段时间这个分享的想法愈发激烈&#xff0c;所以抽时间好好梳理了一番&#xff0c…

如何初始化Git仓库

如何将目录初始化为Git仓库 一级目录二级目录三级目录 一、准备1、安装 gh2、登录 二、初始化 Git 仓库 一级目录 二级目录 三级目录 一、准备 ​ 在这里&#xff0c;我们需要借助一个非常好用的工具&#xff0c;大家也可以参照官方文档进行阅读&#xff0c;下面介绍常用的…

Java Review - 关于代理的二三事儿

文章目录 Pre概述静态代理概述Code 动态代理概述实现方式一 - JDK代理或接口代理概述Code 实现方式二 - CGLib 子类代理 (Code Generation Library)概述pom依赖Code Pre Java-JDK动态代理 Java-CGLib动态代理 概述 代理模式是一种结构型设计模式&#xff0c;其目的是为其他对…

Windows安装MinGW和简单的使用教程

Windows安装MinGW和简单的使用教程 什么是MinGW&#xff1f; MinGW&#xff0c;是Minimalist GNU for Windows的缩写。它是一个可自由使用和自由发布的Windows特定头文件和使用GNU工具集导入库的集合&#xff0c;允许你在GNU/Linux和Windows平台生成本地的Windows程序而不需要…