MybatisPlus批量更新的小插曲

文章讲述了在商城项目中,开发环境与测试环境因表结构不一致导致订单状态同步时,订单明细记录出现问题。通过添加日志和对比环境设计,发现环境因素对数据库结构的影响,强调了保持环境一致性的重要性。

插曲背景

在商城项目中涉及订单业务,有两个主要的表:订单表order和订单明细表order_detail。

  • order表:主要存储订单的主要信息,订单总金额,收货人信息,订单状态等;
  • order_detail表:主要存储订单购买的商品明细信息,每个SKU一条记录;

order表和order_detail表的主键id都是自增的,order表有一个sn字段,order_detail表有一个order_sn字段,这两个表通过sn和order_sn两个字段进行关联,实现业务:1个订单有多少条订单明细记录。

插曲描述

项目增加一个状态同步需求:更新order记录的状态status,同时更新对应的订单明细记录的status。

在开发环境联调测试都是ok的:下单 -> 更新订单状态。然后,在sit测试环境出现一种奇怪的现象,执行状态更新操作之后,指定订单对应的所有的订单明细记录数据全部都变成一样了,且每条记录的id均为0。

因为之前订单功能是已上线的,且数据库变更的管理采用flyway组件,同样的代码在不同的环境执行效果不一样,只能猜测是环境不一样导致的。

开发人员没有sit环境数据库的更新权限,只有只读权限。

问题排查

在更新逻辑代码中增加执行日志输出,重新提测之后。观察操作执行的日志,发现:在【下单】操作之后,生成的订单明细记录id均为0;继续执行更新操作时,所有的订单明细记录数据全部更新为相同的数据。批量更新使用MybatisPlus的updateBatchById方法。

针对上述情况,第一反应是原本自增的id字段值为啥都是0?查看一下sit环境order_detail表的设计语句,发现id字段没有被设置为:自增。再核对了开发环境order_detail表的设计语句,id字段是自增的。

造成问题的原因出来了:sit环境和dev环境的表结构不一致了。将sit环境order_detail表的id设置为自增,重新测试该需求功能,好了!

问题反思

  1. 越让人放心省力的方法,一旦出现问题,越不好排查问题(通过flyway保证各个环境的数据表结构一致,也要小心使用);
  2. 敢于质疑,由于一开始并没有想到会是环境不同导致的问题,一致代码层面排查,所以浪费了时间,比如:修改可疑的代码,增加日志输出等工作。
### 使用 MyBatis-Plus 实现批量插入 MyBatis-Plus 提供了 `saveBatch` 方法用于执行批量插入操作,这能极大提高数据插入效率[^2]。 #### 准备工作 为了使用 MyBatis-Plus批量插入功能,需确保项目已引入必要的依赖项并完成基础配置。通常情况下,会采用 Spring Boot 结合 MySQL 数据库环境进行开发,同时推荐使用 Idea 作为集成开发环境 (IDE),Maven 作为构建工具[^1]。 #### 配置数据库连接参数 对于某些数据库而言,默认的 JDBC 插入语句可能不会被批量化处理,从而影响性能表现。为此,建议在数据库连接字符串中加入特定参数以启用批处理支持: ```properties spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&rewriteBatchedStatements=true ``` 上述 URL 中的关键部分是 `&rewriteBatchedStatements=true` 参数,该选项允许驱动程序重写 SQL 语句以便更好地利用底层数据库引擎的能力来进行高效的数据导入[^4]。 #### 编码实现 下面给出一段简单的 Java 代码示例来说明如何调用 `saveBatch` 进行批量保存实体对象列表至数据库表内: ```java import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.extension.service.IService; public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService { @Override public boolean batchInsertUsers(List<User> userList){ return this.saveBatch(userList); } } ``` 此方法接收一个包含多个用户记录的对象集合,并一次性提交给数据库服务器处理。需要注意的是,实际应用场景下应当考虑事务管理等因素的影响,以保障数据的一致性和可靠性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

萧十一郎君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值