Mybatis批量操作

示例:批量insert多条语句

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

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

XML 复制代码
<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、程序调用

java 复制代码
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条

java 复制代码
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文件如下:

XML 复制代码
<!-- 在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次插入数据量过大问题】

相关推荐
0xDevNull2 分钟前
ConcurrentHashMap 与 Hashtable 深度对比
java·开发语言
happymaker06263 分钟前
Spring学习日记——Day01(简单配置使用Spring,手写Spring的简单工厂模式)
java·学习·spring
木易 士心4 分钟前
深度解析:一个 Java 对象究竟占用多少字节?
java·开发语言·后端
夜猫子ing5 分钟前
《嵌入式 Linux 控制服务从零搭建(二):从目录结构到 CMakeLists,搭一个像样的 C++ 工程骨架》
java·前端·c++
人道领域1 小时前
【LeetCode刷题日记】二叉树翻转:递归与迭代全解析
java·算法·leetcode
Cyan_RA91 小时前
SpringMVC 视图和视图解析器 万字详解
java·spring·mvc·springmvc·请求重定向·modelandview·视图解析器
想学习java初学者9 小时前
SpringBoot整合Vertx-Mqtt多租户(优化版)
java·spring boot·后端
AC赳赳老秦10 小时前
政企内网落地:OpenClaw 离线环境深度适配方案,无外网场景下本地化模型对接与全功能使用
java·大数据·运维·python·自动化·deepseek·openclaw
weixin_4491736510 小时前
在 Java 中,‌线程安全的 List‌ 主要有以下几种实现方式,它们的效率取决于具体的使用场景(尤其是读写比例):
java·线程安全的list
砚底藏山河10 小时前
股票数据API接口:如何获取股票历历史分时KDJ数据
java·python·maven