MyBatis批处理

news/2024/9/25 23:18:22
  1. 减少了jdbc驱动与数据库服务器之间的网络传输开销
    使用batch前:执行一条sql就要进行一次网络IO开销,还要等待服务器响应结束后才能提交下一条sql。预编译n次,设置参数n次,执行n次
    使用batch之后:客户端的多条sql是一起提交给服务器的,一次batch只涉及到一次网络传输开销。预编译一次,设置参数n次,执行一次
    image

批处理注意项:

1. 使用批处理要注意分片大小,不易过大
2. 在使用mybatis内置批处理,本质上也就是jdbc的批处理时,jdbc连接参数要添加rewriteBatchedStatements=true批处理才会生效
3. jdbc相比于Mybatis批处理效率更高
4. 批处理本质上是将拼接好的sql及其填充的数据发送一次网络请求实现的,所以手动拼接sql也可以实现批处理插入
5. 使用sql拼接则不用开启rewriteBatchedStatements,需要设置allowMultiQueries=true,允许更新、修改时候多条sql可以用;分开一起提交到服务器中

手动拼sql

批量新增

<insert id="insertBatch">INSERT INTO `tb_user_info`(`login_account`, `password`, `username`, `dept_id`, `data_status`, `create_by`,`create_time`,`update_by`, `update_time`, `record_version`, `update_count`)VALUES<foreach collection="entities" item="entity" separator=",">(#{entity.loginAccount},#{entity.password},#{entity.username},#{entity.deptId},#{entity.dataStatus},#{entity.createBy},#{entity.createTime},#{entity.updateBy},#{entity.updateTime},#{entity.recordVersion},#{entity.updateCount})</foreach>
</insert>

批量修改

<update id="updateBatchById"><foreach collection="list" item="s" separator=";">update`t_student`set`name` = #{name},`age` = #{age}whereid = #{id}</foreach>
</update>

注意:我们需要通过在数据库连接URL中指定allowMultiQueries参数值为true告诉数据库以支持";"号分隔的多条语句一块的执行,否则会报错

批量删除

使用foreach标签同批量修改、in操作都可以

MyBatis批处理

MyBatis批量新增本质上也是和上边一样手动拼接SQL,但要真正使用MyBatis批处理要指定jdbc驱动rewriteBatchedStatements为true,默认是false,默认false是因为连接属性rewriteBatchedStatements提供了一个非JDBC兼容的特性。并非所有语句都可以重写,并且可能会产生意想不到的结果。特别是关于处理错误和返回更新计数。删除
batchDelete(10条记录)  =>  发送一次请求,内容为”delete from t where id = 1; delete from t where id = 2; delete from t where id = 3; ….”
或者
delete from t where id in(1,2,3,4,5,....n)更新
batchUpdate(10条记录)  =>  发送一次请求,内容为”update t set … where id = 1; update t set … where id = 2; update t set … where id = 3 …”
新增
batchInsert(10条记录)  =>   发送一次请求,内容为”insert into t (…) values (…) , (…), (…)”对delete和update,驱动所做的事就是把多条sql语句累积起来再一次性发出去;而对于insert,驱动则会把多条sql语句重写成一条sql语句,然后再发出去。

rewriteBatchedStatements与allowMultiQueries区别

1. rewriteBatchedStatements是重写sql语句达到发送一次sql的请求效果,
如上述MyBatis批处理,添加是insert into t (…) values (…) , (…), (…)使用逗号分隔,对于**insert**操作使用分号隔开sql语句,一次性发送2. allowMultiQueries是针对于在xml的mapper中使用分号多个sql一块发送执行的,针对与**update,delete**,,默认不允许使用分号有多个sql语句一块执行的。

参考

Mybatis之批量更新数据(批量update) - 知乎 (zhihu.com)

调优 mybatis saveBatch 25倍性能

MySQL Jdbc驱动的rewriteBatchedStatements参数 关于批处理mysql中的rewritebatchedsta来个地瓜的博客-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/30662.html

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

相关文章

Desmos 3D 学习记录

Desmos 3D 学习记录,持续编辑中前言 试用美国人设计的软件Desmos 3D,对网友的使用作以记录。持续编辑中... 试用案例 ✍️ 用 Desmos 3D 制作正方体,相关命令记录; 法1:在输入栏依次手动输入,不能复制, x=[-2,2]{|y|<=2}{|z|<=2} y=[-2,2]{|x|<=2}{|z|<…

实验三 软件测试

一、实验题目 :软件测试 二、实验目的 1、熟悉开发环境下的自动化测试工具; 1、利用自动化测试工具进行自动化单元测试。 三、实验内容 1、选择开发环境,IDEA或PYCHARM任选其一; 2、基于所选择的开发环境实现对输入的n个整数进行排序的代码; 3、对所编写代码设计测试用例…

c++踩方格-动态规划基础题

有一个方格矩阵,矩阵边界在无穷远处。我们做如下假设: a、每走一步时,只能从当前方格移动一格,走到某个相邻的方格上; b、走过的格子立即塌陷无法再走第二次; c、只能向北、东、西三个方向走; 请问:如果允许在方格矩阵上走n步,共有多少种不同的方案。2种走法只要有一步…

Windows分区报错解决

本人神州笔记本,今天在更新时查看了分区,有很多小分区 想合并下,但是把一些系统分区也合并了,导致gg 在合并分区时启动出错,No boot Device 进入 bios里找不到硬盘 在用移动硬盘安装大白菜之类的东西,然后在用傲梅在 C盘分区哪里添EFI和MRB还是什么来着,或者在重装下系…

autoit au3 IT管理员使用指南(二)自动安装软件基础

简介 上篇介绍了au3的基本操作流程,对于我们要自动安装软件,那么就是要安装某个软件,执行一个程序。 本篇介绍执行一个程序。 Run 我们可以通过Run命令来执行一个程序,那么我们尝试执行一下搜狗输入法吧。 创建sougou_input目录,下载搜狗输入法安装文件放入该目录。 创建一…

宝塔docker快速安装Halo

宝塔docker快速安装Halo 一、Docker 部署Halo 我们前面还是需要先在宝塔面板环境中安装Docker,一般默认时候是没有安装的。这里我们在宝塔面板中的Docker管理器应用商店中安装。我们可以看到直接等待安装成功。后面在部署程序的时候有需要用到这里界面。二、这里我们在【镜像管…

Bean的作用域和自动装配

Spring Bean的作用域主要有五种Singleton是单例类型,就是在创建起容器时就同时自动创建了一个bean的对象,不管你是否使用,他都存在了,每次获取到的对象都是同一个对象。注意,singleton作用域是Spring中的缺省作用域(默认的作用域)。 prototype是原型类型,它在我们创建容…