mybatis用 foreach 分批量插入 insert

作者在处理文件上传时遇到SQL错误,源于配置文件中的foreach语法错误和缺少allowMultiQueries设置。该错误导致不能正确执行多语句和批处理。修正后的配置解决了问题,承诺会继续分享此类技术难题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先这个是我插入时,后台所报的错误,这里我用的是文件上传,为了减少消耗数据库性能,将数据分批段去插入,然后在xml中遇到这个问题。

这是我的xml中错误的sql:

其中貌似看着没什么问题,因为开始的时候用的是原有的添加语句,直接copy过来的,所以也没有多想,忽略了其中的细节问题。

错误原因:在配置文件中少了下面的那个sql多语句执行的语句,foreach 位置写错,以及结束符号为分号。

这是改完正确的sql:

在这种批量处理多个sql的时候需要在配置文件中数据库连接语句中加入 :

allowMultiQueries=true

这个语句主要作用是:

1.可以在sql语句后携带分号,实现多语句执行。

2.可以执行批处理,同时发出多个SQL语句。

此次碰到的就是这个问题,后续有问题会持续记录并分享的。

### MyBatis插入实现方式与最佳实践 #### 使用 `ExecutorType.BATCH` 提升性能 为了提高批插入的效率,建议使用 MyBatis 的 `ExecutorType.BATCH` 模式。这种方式允许重复利用预编译语句,并且能够一次性提交多个更新操作,从而减少网络开销和数据库连接资源消耗[^5]。 ```java SqlSessionFactory sqlSessionFactory = ...; SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH); try { UserMapper userMapper = sqlSession.getMapper(UserMapper.class); for (User user : userList) { userMapper.insert(user); } sqlSession.commit(); } finally { sqlSession.close(); } ``` #### 利用 MyBatis Plus 封装简化开发 对于追求更高层次抽象的应用场景,MyBatis Plus 是一种理想的选择。其提供了简单易用的方法来完成批保存操作,减少了开发者的工作负担的同时也提高了代码质[^1]。 ```java List<Entity> entities = ...; // 准备好要插入的数据列表 mapper.saveBatch(entities); // 调用此方法即可快速完成大批记录的存储工作 ``` #### 配置合理的批处理大小 当面对海数据时,应考虑设置合适的批次大小以平衡内存占用率和吞吐之间的关系。过大的批次可能导致过多临时对象堆积于堆空间内引发GC压力;反之则可能因频繁交互影响整体效能表现[^3]。 ```xml <insert id="batchInsert"> INSERT INTO table_name(column_list) VALUES <foreach collection="list" item="item" separator=","> (#{item.column1}, #{item.column2}) </foreach> </insert> ``` #### 关闭自动提交并手动控制事务边界 关闭默认开启状态下的自动提交选项有助于更好地掌控整个过程中的异常情况以及回滚机制的设计。同时,在适当位置显式定义事务范围也有助于增强系统的稳定性和可靠性[^2]。 ```properties spring.datasource.hikari.auto-commit=false ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值