Loading... ## 1.背景介绍 在写crud时使用mybatis写批量插入用的foreach标签,报错` Packet for query is too large (9601829 > 4194304).` 当遇到比较多的数据时,就会出现这个错误,比如excel导入时。 ## 2.推荐方法 在官网中:https://mybatis.org/mybatis-dynamic-sql/docs/insert.html **查阅了资料发现:** ### 官网推荐的批量方法如下 ```java try(SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH)) { SimpleTableMapper mapper = session.getMapper(SimpleTableMapper.class); List<SimpleTableRecord> records = getRecordsToInsert(); // not shown BatchInsert<SimpleTableRecord> batchInsert = insert(records) .into(simpleTable) .map(id).toProperty("id") .map(firstName).toProperty("firstName") .map(lastName).toProperty("lastName") .map(birthDate).toProperty("birthDate") .map(employed).toProperty("employed") .map(occupation).toProperty("occupation") .build() .render(RenderingStrategies.MYBATIS3); batchInsert.insertStatements().forEach(mapper::insert); session.commit(); } ``` #### 对应的SpringBoot方式如下 > 注意如果SimpleTableMapper方法继承了Mapper,不要写insert方法,不然冲突了,Mapper已经存在insert方法。 ```java @Mapper public interface SimpleTableMapper { void insert(SimpleTableRecord record); } ``` ```java @Service public class SimpleTableService { @Autowired private SimpleTableMapper mapper; @Autowired private SqlSessionFactory sqlSessionFactory; public void insertRecords(List<SimpleTableRecord> records) { try (SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH)) { for (SimpleTableRecord record : records) { mapper.insert(record); } session.commit(); } } ``` ## 3.优势 使用批量插入相比于逐条插入的方式,具有以下优势: 1. 提高插入效率:批量插入可以减少与数据库的通信次数,一次性将多条记录发送给数据库,从而有效提高插入的效率。 2. 减少事务开销:在批量插入中,可以将多个插入操作合并为一个事务,减少了事务的开销。相比于逐条插入需要每条数据都开启和关闭事务,批量插入可以显著降低事务管理的开销。 3. 降低系统负载:由于批量插入减少了与数据库的交互次数,减轻了系统的负担和网络传输的压力,有助于提高整个系统的性能和响应速度。 4. 简化代码逻辑:通过批量插入,可以将多个插入操作合并到一起,简化了代码逻辑。不再需要手动遍历进行逐条插入,降低了代码的复杂性和维护成本。 综上所述,批量插入在大规模数据插入时具有明显的性能优势,并且可以降低系统负载和简化代码逻辑。对于需要频繁插入大量数据的场景,使用批量插入是一个更加高效和可靠的选择。 最后修改:2024 年 01 月 22 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 1 如果觉得我的文章对你有用,请随意赞赏