千家信息网

MyBatis如何批量插入大量数据

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章将为大家详细讲解有关MyBatis如何批量插入大量数据,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。问题背景:只用MyBatis中foreach进行批量插入
千家信息网最后更新 2026年11月02日MyBatis如何批量插入大量数据

这篇文章将为大家详细讲解有关MyBatis如何批量插入大量数据,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

问题背景:只用MyBatis中foreach进行批量插入数据,一次性插入超过一千条的时候MyBatis开始报错。项目使用技术:SpringBoot、MyBatis

批量插入碰到的问题:

java.lang.StackOverflowError: null

该问题是由于一次性插入数据1w条引起的,具体插入代码如下:

userDao.batchInsert(list);    INSERT INTO USER            ID, AGE, NAME, EMAIL        SELECT A.*    FROM    (    SELECT    sys_guid(), #{user.age}, #{user.name}, #{user.email}    FROM dual) A

以上的插入代码其实也是一种批量插入的方式,但是他的灵界点并不高,插入数据过多的时候,可能需要我们使用代码在一次分批。当然如果插入数据不超过5000的时候可以直接这么使用

插入1w条数据,发现出现错误,原因是数据量过大,栈内存溢出了。mybatis中直接使用foreach插入数据,就相当于将所有的sql预先拼接到一起,然后一起提交。这本身就是一种批量插入的处理方案,但是达不到我们要求。主要是插入有上限。如果需要更多的数据导入,我们需要更换一种方式来解决这个问题,mybatis中ExecutorType的使用。

mybatis中ExecutorType的使用

Mybatis内置的ExecutorType有3种,SIMPLE、REUSE、BATCH; 默认的是simple,该模式下它为每个语句的执行创建一个新的预处理语句,单条提交sql;而batch模式重复使用已经预处理的语句,并且批量执行所有更新语句,显然batch性能将更优;但batch模式也有自己的问题,比如在Insert操作时,在事务没有提交之前,是没有办法获取到自增的id,这在某型情形下是不符合业务要求的;

插入大量数据的解决方案,使用ExecutorType

为了能够高效,并且解决上述问题,我们使用ExecutorType,并分批插入。代码如下:

//我们使用的是springboot,sqlSessionTemplate是可以自己注入的@Autowiredprivate SqlSessionTemplate sqlSessionTemplate;public void insertExcelData(List list) {    //如果自动提交设置为true,将无法控制提交的条数,改为最后统一提交,可能导致内存溢出    SqlSession session = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH, false);    //不自动提交    try {        UserDao userDao = session.getMapper(UserDao.class);        for (int i = 0; i < list.size(); i++) {            userDao.insert(list.get(i));            if (i % 400 == 0 || i == list.size() - 1) {                //手动每400条提交一次,提交后无法回滚                session.commit();                //清理缓存,防止溢出                session.clearCache();            }        }    } catch (Exception e) {        //没有提交的数据可以回滚        session.rollback();    } finally {        session.close();    }}userDao.insert(User user);    insert into USER    (id            ,age                ,name                ,email        )    values (    sys_guid()            ,#{age}                ,#{name}                ,#{email}    )

这里采用的是单条插入,直接使用for循环,但是使用ExecutorType.BACTH就相当于手动提交。这也是我们需要的效果,所以我们在循环里面判断了,是否到了第400笔,如果到了第400笔就直接提交,然后清空缓存,防止溢出。这样就有效的实现了批量插入,同时保证溢出问题的不出现

关于"MyBatis如何批量插入大量数据"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

数据 问题 代码 语句 时候 更多 模式 篇文章 一次性 内存 手动 方式 方案 缓存 循环 预处理 不错 实用 有效 上限 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 科技股互联网 疫情对互联网科技公司影响 美国互联网科技巨头监管 多迪互联网科技有限公司 联恩商钥互联网科技有限公司 深圳互联网科技怎么样 山东吉时兔互联网科技有限公司 新华互联网科技2019 字节跳动和互联网科技 互联网对科技的发展 亳州好赞互联网科技有限公司 佛山市翊博互联网络科技有限公司 明优互联网科技有限公司 为客找房互联网科技公司怎么样 合肥互联网科技公司公章图片 卡尔迅互联网科技有限公司 科技信息时代互联网发展 承德科技产业互联网平台 东风日产互联网科技公司叫什么 互联网科技创新方面的资料 互联网 科技 智网互联网科技 互联网科技的英文 天津摩尔互联网科技 广州慧亚互联网科技怎么样 来此购互联网科技有限公司 佛山市翊博互联网络科技有限公司 银行科技岗属于互联网吗 互联网安防科技感 江苏互联网智能科技产品出厂价
0