首页 > 其他分享 >MyBatis批处理

MyBatis批处理

时间:2024-05-12 19:08:19浏览次数:20  
标签:批处理 update entity sql MyBatis where id

  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}
        where
            id = #{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博客

标签:批处理,update,entity,sql,MyBatis,where,id
From: https://www.cnblogs.com/party-abu/p/18188070

相关文章

  • Mybatis中引用类型不需要加@param()注解
    在MyBatis中,对于引用类型的参数(即Java对象),通常不需要使用@Param注解,除非你在映射文件中使用了多个参数,并且这些参数不是封装在一个对象中的。当你只有一个引用类型的参数传递给MyBatis的映射器方法时,MyBatis会自动将该参数作为唯一参数处理,并可以在SQL映射文件中通过......
  • mybatis缓存
    缓存缓存(即cache)的作用是为了减去数据库的压力,提高数据库的性能。缓存实现的原理是从数据库中查询出来的对象在使用完后不销毁,而是存储在内存(缓存)中,当再次需要获取该对象时,直接从内存中获取,不再向数据库执行select语句,减少对数据库的查询次数,提高了数据库的性能。缓存是使用Map......
  • LOTO示波器动作编程功能(命令批处理)
     动作编程功能是为了方便客户根据自己的应用场景,做到一个按键就连续做多个示波器操作,从而降低了对操作人员的技术要求,做到傻瓜式操作。之前LOTO有个类似的功能,是把示波器的基础设置根据不同的测试场景存成不同的设置文件,需要时可以选择合适的场景设置导入进来这个设置文件。它和......
  • SpringBoot整合Mybatis时mapper文件和xml文件的位置
    xml文件放在resources下看下我的项目目录2.由于放在resurces下就无法扫描到xml文件,所以就需要在配置文件配置--mapper文件位置mybatis.mapper-locations=classpath:mapper/*.xml或mybatis.mapper-locations=classpath:/mapper/*.xmlxml和mapper文件放在一起我的项目......
  • mybatisplus 中查询的实体对应的表名是动态的解决方案
    开发中遇到需要查询一些表里的数据,这些数据按照一定的规则存放在不同的数据库表里,例如表名是table_name+月份 table_name_2024_05,table_name_2024_04这样,这些表的结构都相同。网上找了一些动态修改实体对应数据库表名的方法,操作相对复杂而且跟mybatisplus的版本有关。自己......
  • mybatis核心配置文件
    在resource目录下,创建mybatis-config.xml(官方建议起名方式)核心配置文件常用元素properties:通过resource属性从外部指定属性文件(db.properties),该属性文件描述数据库连接的相关配置(数据库驱动、连接数据库的url、数据库用户名、数据库密码),位置也是在/resources目录下settin......
  • mybatis中的增删改操作
    在之前的操作之后,若要编写增删改操作,需要变动的只有UserMapper接口,UserMapper.xml以及测试类举例删除操作-delete://Dao层接口UserMapper增加deleteById方法:intdeleteById(intid);映射文件UserMapper.xml中增加与Dao层接口匹配的如下内容<!--删除操作--><deleteid="......
  • 第一个mybatis程序
    注意与之前JDBC的区别,简化在哪里准备工作数据库,表的创建:创建一个名为mybatis的数据库,在其中创建user表,字段为is,name,pwd项目的准备:新建一个普通的maven项目作为父项目,删除src目录,在pom文件中导入必要的依赖(mysql-connector-java,mybatis,junit),创建第一个子项目,选择父项目......
  • 批处理文本替换脚本
    将AAA文件里全部子文件中包含aaabbbccc的内容分别替换为eeefffggg点击查看代码chcp65001@echooffsetlocalenabledelayedexpansion::创建一个临时文件来保存包含目录列表的文件名dir/b/ad"AAA">temp_dirs.txt::检查临时文件是否存在......
  • Mybatis基础知识
    什么是mybatis?mybatis是一款用于持久层的、轻量级的半自动化ORM框架,封装了所有jdbc操作以及设置查询参数和获取结果集的操作,支持自定义sql、存储过程和高级映射。框架用于持久层,就是说这个框架是和数据库进行交互的,用于数据库中数据操作的框架轻量级框架的概念可以简单的理......