当前位置: 首页 > news >正文

Mybatis批量操作

示例:批量insert多条语句

1、mapper文件中定义sql,your_table 要插入数据的表名,column1, column2, ... 是表中的列名,field1, field2, ... 是对应表的Entity中的属性名,执行的后生成的sql如下:

INSERT INTO your_table (column1, column2, ...) VALUES(column1, column2, ...),(...)

<insert id="batchInsert">INSERT INTO your_table (column1, column2, ...)VALUES<foreach collection="list" item="item" index="index" separator=",">(#{item.field1}, #{item.field2}, ...)</foreach>
</insert>

2、程序调用

List<YourEntity> entities = new ArrayList<>();
// 填充entities列表
YourMapper mapper = sqlSession.getMapper(YourMapper.class);
mapper.batchInsert(entities);
sqlSession.commit();

上述程序执行后,后台只会发送1条sql语句:INSERT INTO your_table (column1, column2, ...) VALUES(column1, column2, ...),(...)

当1次插入的数据量过大,如100万,受限于网络包大小限制或者有些数据库有最大接受包的限制(如mysql 中max_allowed_packet 参数限制,默认值为4M),会出现如下sql异常:com.mysql.jdbc.PacketTooBigException

解决1次插入数据量过大问题:

解决办法,分批插入,比如每次插入200条

public void insertLargeNumberOfRecords(List<YourEntity> entities) {int batchSize = 200;int numberOfBatches = (entities.size() + batchSize - 1) / batchSize;for (int i = 0; i < numberOfBatches; ++i) {int start = i * batchSize;int end = Math.min(start + batchSize, entities.size());List<YourEntity> batchEntities = entities.subList(start, end);yourMapper.insertBatch(batchEntities);}
}

示例:批量删除

mapp文件如下:

<!-- 在Mapper XML中定义批量删除的操作 -->
<delete id="batchDelete" parameterType="list">DELETE FROM your_table WHERE id IN<foreach item="item" collection="list" open="(" separator="," close=")">#{item}</foreach>
</delete>

1次删除数据量过大问题解决办法参考【解决1次插入数据量过大问题】

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • CISP备考题库(八)
  • JavaScript match() 方法
  • 如何在Android上实现RTSP服务器
  • 【案例71】配置https之后 IE打不开登陆页面 Uclient没有问题
  • JS日期转化指定格式,获取月/周日期区间
  • Spring Boot入门:构建你的首个Spring Boot应用
  • Laya2.x出包alipay小游戏
  • 数据恢复免费版工具大比拼,哪款才是你的“救星”?
  • Linux运维篇-tigervnc工具的使用
  • 机器学习特征-学习篇
  • rtems 5.3 qemu realview_pbx_a9 环境搭建:生成 rtems arm 工具链
  • Maven下载安装
  • 物联网之Arduino编程语言、条件语句、循环语句、变量、数组、函数
  • IP协议及相关特性
  • WMS仓储系统的真正价值:从混乱到有序,亿发WMS如何重塑仓库管理
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • __proto__ 和 prototype的关系
  • C++11: atomic 头文件
  • CentOS从零开始部署Nodejs项目
  • gitlab-ci配置详解(一)
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • python_bomb----数据类型总结
  • Spring Cloud Feign的两种使用姿势
  • Terraform入门 - 1. 安装Terraform
  • vue 个人积累(使用工具,组件)
  • Vue2.0 实现互斥
  • 关于for循环的简单归纳
  • 如何学习JavaEE,项目又该如何做?
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 算法---两个栈实现一个队列
  • 异步
  • Spring第一个helloWorld
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • #每日一题合集#牛客JZ23-JZ33
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (二)十分简易快速 自己训练样本 opencv级联lbp分类器 车牌识别
  • (翻译)terry crowley: 写给程序员
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (七)Appdesigner-初步入门及常用组件的使用方法说明
  • (三) diretfbrc详解
  • (四)进入MySQL 【事务】
  • (转)母版页和相对路径
  • ****Linux下Mysql的安装和配置
  • .NET CF命令行调试器MDbg入门(三) 进程控制
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布
  • .Net IOC框架入门之一 Unity
  • .net 简单实现MD5
  • @AutoConfigurationPackage的使用
  • @RunWith注解作用
  • @Transactional 参数详解
  • [2]十道算法题【Java实现】
  • [Big Data - Kafka] kafka学习笔记:知识点整理
  • [C puzzle book] types