Mybatis 批量优化及参数讲解

Mybatis批量更新数据及其优化 临时关联更新操作不能应用在Trascational事务中,创建临时表的操作在事务中不支持,需要做其他处理;:定时任务中,从其他平台同步数据,并更新当前平台数据库,表数据3W+,分批更新某个字段,耗时巨大,约30min,尝试性能优化。2.先删后增,取出原数据内存中更新后,先将全表数据删除,再insert插入;或者设置标志字段,先增后删,思路一致。:当前场景需要去更新某个字段,且数据量较大,几百条数据每批进行更新,应用foreach循环更新时,耗时巨大;:使用临时表关联全表更新,一次关联,一次更新; 阅读详情

前言

  Mybatis 对于大家来说真是再熟悉不过了,ORM映射框架,目前在国内项目中备受青睐,
适合国内复杂的业务场景以及敏捷开发的需要,不过其参数的使用有事让人迷糊,今天就好好的讲一下,可以做个参考节省时间。

批量更新

#dao 层
 void batchUpdateTargetData(@Param(value = "encryptListData") List<UserInfo> encryptListData,@Param(value = "yearNum") Integer yearNum);
## 第一种更新 (优点:
1.书写方便
2.不用考虑条数限制
缺点:
1. 性能差
2. 数据库连接配置多条查询
)
<update id="batchUpdateTargetData">
    <foreach collection="encryptListData" item="encryptData" index="index" open="" close="" separator=";">
        update tableName_${yearNum}
     prefix="set" suffixOverrides=",">
            <if test="encryptData.receiverName!=null and encryptData.receiverName!=''">
                receiver_name =#{encryptData.receiverName},
            </if>

            <if test="encryptData.receiverAddress!=null and encryptData.receiverAddress!=''">
                receiver_address =#{encryptData.receiverAddress},
            </if>

            <if test="encryptData.receiverMobile!=null and encryptData.receiverMobile!=''" >
                receiver_mobile =#{encryptData.receiverMobile},
            </if>
            <if test="encryptData.receiverPhone!=null and encryptData.receiverPhone!=''">
                receiver_phone=#{encryptData.receiverPhone}
            </if>

        </trim>
        where id = #{encryptData.id} 
    </foreach>
</update>

### 第二种更新(优点:
1.性能好
2.数据库连接不用配置多条查询
缺点:
1. 书写复杂
2. 注意每个数据库in 数据的限制
3. 建议分批
)
 <update id="batchUpdateTargetData">
        update tableName_${yearNum}
        <trim prefix="set" suffixOverrides=",">
            <trim prefix="receiver_name=case" suffix="end,">
                <foreach collection="encryptListData" item="encryptData" index="index">
                    <if test="encryptData.receiverName!=null and encryptData.receiverName!=''">
                        when id = #{encryptData.id}  then #{encryptData.receiverName}
                    </if>
                </foreach>
            </trim>
            <trim prefix="receiver_address =case" suffix="end,">
                <foreach collection="encryptListData" item="encryptData" index="index">
                    <if test="encryptData.receiverAddress!=null and encryptData.receiverAddress!=''">
                        when id = #{encryptData.id}  then #{encryptData.receiverAddress}
                    </if>
                </foreach>
            </trim>
            <trim prefix="receiver_mobile=case" suffix="end,">
                <foreach collection="encryptListData" item="encryptData" index="index">
                    <if test="encryptData.receiverMobile!=null and encryptData.receiverMobile!=''" >
                        when id = #{encryptData.id}  then #{encryptData.receiverMobile}
                    </if>
                </foreach>
            </trim>

        </trim>
        where  id in
        <trim prefix="(" suffix=")">
            <foreach collection="encryptListData" separator="," item="encryptData" index="index" >
                #{encryptData.id}
            </foreach>
        </trim>
    </update>

###  批量删除的优化
dao 层
void deleteDetailsByIds(@Param(value = "tenantId") Long tenantId, @Param(value = "ids") List<Long> ids);

mapper 层
<delete id="deleteDetailsByIds">
        delete from table_name
        where tenant_id = #{tenantId}
        <choose>
            <when test=" null!=ids and ids.size()==1">
              and  id =#{ids[0]}
            </when>
            <otherwise>
              and  id in
                <foreach collection="ids" separator="," open="(" close=")" item="id">
                    #{id}
                </foreach>
            </otherwise>
        </choose>
    </delete>

void updateDetailsByIds(@Param(value = "tenantId") Long tenantId, @Param(value = "ids") List<Long> ids);
mapper 层:

注意点:
  1. ids.size() ==1  ===>用 ==  进行比较
  2. 注意 in 要写在 foreach  外面
  3. 赋值用 单引号 '' 表示字符串    
  4. ${field_value}  必需是前面传过来的
<update id="batchUpdateProdStatusWithIdList">
        update table_name
        set `status` = 'down'
        where prod_id
        <if test="prodIdList !=null and prodIdList.size>0">
            <choose>
                <when test="prodIdList.size==1">
                    =#{prodIdList[0]}
                </when>
                <otherwise>
                    in
                    <if test="prodIdList !=null and prodIdList.size>1">
                        <foreach collection="prodIdList" item="prodId" open="(" separator="," close=")">
                             #{prodId}
                        </foreach>
                    </if>

                </otherwise>
            </choose>
        </if>
    </update>

对应标签解释

@Param(value = "encryptListData") List<UserInfo> encryptListData
@Param  代表着绑定字段 dao层只有一个参数可以不写,多个必须写,不然找不到对应的参数
 collection          ————>  当前传参传入的集合类型参数
 item                ————> 当前集合对应的别名,也就是下面操作的对象
 open                ————>  起始的标志
 close               ————>  关闭的标志
 separator           ————>  数据分割的标志
 index               ————>   索引可写可不写 基本用不到 可以直接写index ,
  
   tirm 语法格式 类似Java StringBuilder append() 拼接的作用
  <trim prefix=" " suffix="" suffixOverrides="" prefixOverrides="">
             
  </trim>
  prefix             ————>  前缀
  suffix             ————> 后缀
  suffixOverrides    ————> 去掉重复的后缀  比如 or
  prefixOverrides    ————> 去掉重复的前缀  比如 and 和 where 一起使用不用考虑 and 的位置

使用MyBatis批量查询(select)、批量插入(insert)、批量更新(update)、批量删除(delete) 记录:412 场景:使用MyBatis批量查询(select)、批量插入(insert)、批量更新(update)、批量删除(delete)操作MySQL数据库。 阅读详情

相关推荐

MyBatis的性能优化——批量操作

批量操作是数据处理场景中的性能关键点,尤其在数据迁移、报表生成等大数据量场景下,优化效果可提升10倍以上性能。

2301_81186831的博客 3016

MyBatis实现批量修改的三种办法

MyBatis实现批量修改

lili的点点滴滴 3万+

Mybatis CRUD实战:从配置到动态SQL与批量操作详解

ORM(对象关系映射)是Java后端开发中连接应用与数据库的核心技术,它通过将数据库表映射为Java对象,简化了数据持久化操作。其原理在于利用反射和元数据,在运行时自动处理SQL生成、参数绑定和结果集映射,从而提升开发效率并降低手写SQL的出错率。在众多ORM框架中,Mybatis以其半自动化的设计脱颖而出,它精准平衡了SQL的灵活控制与开发便捷性,尤其适用于需要精细优化SQL性能或处理复杂查询的场景。通过XML或注解配置SQL语句,开发者可以完全掌控数据库交互细节,同时利用其动态SQL、缓存机制等特性应对

weixin_30319153的博客 391

Mybatis批量操作解析

我们在项目中会有一些批量操作的场景,比如导入文件批量处理数据的情况(批量新增商户、批量修改商户信息),当数据量非常大,比如超过几万条的时候,在Java代码中循环发送SQL到数据库执行肯定是不现实的,因为这个意味着要跟数据库创建几万次会话。即使在同一个连接中,也有重复编译和执行SQL的开销。例如循环插入10000条(大约耗时3秒钟)∶在MyBatis里面是支持批量的操作的,包括批量的插入、更新、删除。......

想着百万年薪努力的小赵 1万+

MyBatis-Plus批量插入性能翻倍秘籍:rewriteBatchedStatements参数详解

本文深入解析MyBatis-Plus批量插入性能优化的关键参数rewriteBatchedStatements,揭示其如何通过重写SQL语句实现性能翻倍。结合saveBatch方法的使用技巧和JDBC驱动配置,提供从基础到高级的优化方案,帮助开发者显著提升数据库操作效率。

weixin_29204749的博客 202

从《视觉SLAM十四讲》到项目实战:一文读懂拓扑地图与语义地图为何是服务机器人的未来

本文探讨了服务机器人地图技术的演进,从传统几何地图到拓扑地图与语义地图的跨越。通过分析栅格地图的局限性和拓扑地图、语义地图的优势,揭示了它们在动态开放环境中的智能应用。文章还介绍了多模态语义融合架构和动态语义更新技术,为服务机器人的未来发展提供了技术路线图。

weixin_30292843的博客 478

MyBatis 性能优化指南:Mapper 映射、缓存与批量操作实战

MyBatis 在灵活性和可控性上很强,但不注意会导致 N+1 查询、过度全列查询、缓存失效和低效的批量操作。本文先讲清核心概念(Mapper 映射/结果映射、一级/二级缓存、批处理),再给出完整实战项目:用 Spring Boot + MyBatis 模拟订单/订单明细场景,演示如何用 executorType=BATCH、合理 Mapper 映射和二级缓存把性能拉上来,并给出对比测试数据与优化建议。

xu11410的博客 1228

谷粒商城篇章9 ---- P248-P261/P292-P294 ---- 消息队列【分布式高级篇六】

RabbitMQ消息队列、RabbitMQ延时队列。

weixin_48568302的博客 1551

揭秘MyBatis foreach标签:如何高效遍历数组实现批量操作?

掌握MyBatis动态SQL技巧,轻松实现批量操作。通过foreach标签循环数组,精准构建IN查询与批量增删改语句,提升数据库处理效率。详解适用场景与核心用法,避免常见错误,助力Java开发高效集成,值得收藏。

CodeNexus的博客 952

远程桌面项目

远程桌面项目

weixin_41560737的博客 1934

eDP/DP接口简介

目前,在视频传输协议以及接口领域,外部接口主要是DP与HDMI两分天下,当然之前出现过很多接口-VGA, DVI等等,最新平台基本以这两个为主;笔记本内部接口就基本上使用eDP((Embedded Display Port))作为标准接口来驱动液晶屏了。那么问题来了,eDP和DP,是完全兼容的么?eDP,DP,HDMI,这三种接口的显示器,可以插在同一个接口上使用么?这篇文章,就会从硬件和一部分协议的角度分析一下这三大协议。

weixin_50518899的博客 2万+

MyBatis foreach循环Map参数实战(资深架构师亲授优化技巧)

掌握MyBatis的foreach循环Map参数用法,解决动态SQL拼接难题。适用于批量查询、更新等场景,通过key-value遍历实现灵活参数传递,提升SQL可读性与执行效率。资深架构师亲授优化技巧,值得收藏。

VarFlow的博客 1043

Silly Tavern(酒馆)AI 角色扮演下载与安装教程(Windows本地部署)

SillyTavern是一款开源AI角色扮演前端工具,支持沉浸式对话和长期角色互动。本文详细介绍了在Windows系统F盘部署SillyTavern的完整流程,包括下载项目、安装Node.js和Git环境、配置路径、启动服务等关键步骤,并特别说明非系统盘路径可能遇到的npm安装问题及解决方法。成功启动后,用户可通过浏览器访问本地地址使用该工具进行AI角色扮演互动。

Tan3851的博客 1万+

MyBatis批量更新入门:5分钟学会高效数据操作

我测试批量更新功能时,发现它的实时反馈很及时,出错也能快速定位问题。今天整理一下MyBatis批量更新的入门笔记,这个功能在实际开发中特别实用,能大幅提升数据库操作效率。作为刚接触MyBatis的新手,我记录下这个从零开始的学习过程,希望能帮到同样入门的朋友。接口方法不需要实现,具体的SQL会在XML中定义。要注意设置正确的参数名和字段映射,这是最容易出错的地方之一。建表SQL语句要注意设置合适的数据类型和主键,这是后续操作的基础。批量操作必须放在事务中执行,忘记提交事务是最常见的错误。

IndigoNight21的博客 338

谷粒商城 - 个人笔记(集群部署篇一)

电商后台管理系统+电商系统,掌握微服务的全套方案。该系统有商品服务、仓储服务、订单服务、购物车服务、检索服务、认证中心服务、网关服务、用户服务、秒杀服务、第三方服务。使用SpringBoot+SpringCloud并配套SpringCloud Alibaba系列,引入全套微服务治理方案:Nacos注册中心/配置中心、Feign远程调用、Gateway网关、Redisson缓存、基于ElasticSearch7全文检索、异步编排与线程池、RabbitMQ柔性事务方案、Redisson分布式锁、分布式信号量等。

知行 4009

23种设计模式-代理(Proxy)设计模式

软考中级-软件设计师 代理设计模式

片言可决讼,半纸能缚龙 1784

mybatis使用(2)

1.selectKey元素 selectKey: int insert2(TUser record); <insert id="insert2" parameterType="TUser"> <selectKey keyProperty="id" order="AFTER" resultType="int"> select LAST_INSERT_ID()...

qq_3316359388的博客 357

4、高级认证解决方案:Active Directory、LDAP、RADIUS和TACACS+深度解析

本文深入解析了多种高级认证解决方案,包括Active Directory、标准LDAP、RADIUS和TACACS+,涵盖其技术优势、配置步骤及适用场景。同时介绍了如何实现通用用户管理,包括使用第三方认证解决方案和ADSI自助用户管理。通过实际案例部署,展示了如何高效、安全地管理大规模用户认证与权限控制,为企业安全架构提供参考。

o4p5q6r7s的博客 307

Mybatis批量插入大量数据

用Mybatis插入大量数据的注意事项: <insert id="insetList" parameterType="java.util.List" > insert ignore into application (proposalno, policyno ) <foreach collection="list" item="item" index="index" separator=","> ( #{item.proposalno},

woerry的专栏 1493

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

MyBatis 批量插入别再乱用 foreach 了,5000 条居然花了 14 分钟...

近日,项目中有一个耗时较长的Job存在CPU占用过高的问题,经排查发现,主要时间消耗在往MyBatis中批量插入数据。mapper configuration是用foreach循环做的,差不多是这样。(由于项目保密,以下代码均为自己手写的demo代码)<insertid="batchInsert"parameterType="java.util.List"> insert...

Java精选 782

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

MyBatis批量操作终极指南:从基础到高级实战(附完整代码示例)

本文全面解析MyBatis批量操作技术,从基础到高级实战,涵盖批量添加、更新、删除等核心场景。通过foreach标签的深度应用和完整代码示例,帮助开发者掌握高效数据库操作技巧,显著提升数据处理性能。特别针对大数据量场景提供优化建议,是MyBatis批量操作的终极指南。

github5actions的博客 1016

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

mybatis sql 删除多行_mybatis 根据id批量删除的实现操作

第一种,直接传递给mapper.xml 集合/数组形式delete from user where 1>2or id in#{item}1.如果传入的是单参数且参数类型是一个List的时候,collection属性值为listint deleteByLogic(List list);2.如果传入的是单参数且参数类型是一个array数组的时候, 参数类型为parameterType="int"...

weixin_39619433的博客 640

mybatis所有要点

Mybatis 一、Mybatis简介 1.1 认识mybatis ​ MyBatis 是Apache的一个开源项目iBatis,是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。 ​ 简单的说:MyBatis是一个半自动ORM框架,其本质是对JDBC的封装。使用MyBatis重点需要程序员编写SQL命令,不需要写一行JDBC代码。 1.2 mybatis和Hibernate Mybatis半自动化框架 表需要手动进行设计 依赖数据库平台 优化灵活,合适做互联网项

qq_41943011的博客 395

MyBatis

1准备数据库,导入相关依赖2创建实体类3创建~Mapper接口和~Mapperxml的xml文件(来存放sql语句)4~Mapperxml:(1映射对应Java文件(用接口的全限定符)2声明标签写SQL语句(id=方法名,resulType=实体类的全限定符))5写xml文件(配置数据库,~Mapperxml文件) 6测试java:在xml文件中,设置标签#{}:占位符+赋值(可防止注入攻击,所以动态值用)(动态列名,关键字用不了)${}:字符串拼接(动态列名,关键字用)执行操作sql的

m0_63217145的博客 1044

Mybatis详解(二)Mybatis XML方式的基本用法

1、使用XML方式 MyBatis的真正强大之处在于它的映射语句,由于他的映射语句异常强大,映射器的XML文件就显得相对简单。而MyBatis3.0相比2.0版本的一个最大变化,就是支持使用接口的来调用方法。 我们使用的是SqlSession通过命名空间调用MyBatis方法,我们需要用到命名空间和方法id组成的字符串来调用相应的方法。而当参数多于1个的时候,需要将参数放到一个Map对象中。...

川子的博客 1816

10倍性能提升:MyBatis-Plus连接池配置与SQL执行优化全指南

你是否还在为数据库连接耗尽、SQL执行缓慢而烦恼?作为MyBatis的增强工具包,MyBatis-Plus不仅简化了CRUD操作,更隐藏着诸多性能优化利器。本文将从连接池配置到SQL执行优化,手把手教你释放数据库性能潜力,让应用响应速度提升10倍。读完本文你将掌握:HikariCP参数调优技巧、索引失效排查方法、批量操作性能对比及SQL注入器自定义方案。 ## 关于MyBatis-Plus M...

gitblog_00396的博客 1192
上一篇: 线程池秒懂
下一篇: idea Git 秒上手
WindwardBird
博客等级 码龄7年 19粉丝 94原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值