问题背景
- 在开发过程中,我们经常会使用 MyBatis-Plus 来简化与数据库的交互,其中 IdType是一个重要的配置项,用于指定实体类中主键的生成策略。然而,在使用 Mapper 文件进行插入操作时,有时候会遇到IdType策略不生效的情况,这引发了我对问题的深入探索。
- 今天在修改公司接口时,顺手测试了一下新增功能,发现报错:Column 'xx_id' cannot be null,奇怪,明明这是一个很老的接口了,为什么还会有这个错误呢?
解决过程
- 我检查了实体类中的主键字段是否正确使用了 @TableId注解,并指定了正确的主键策略。确认配置没有问题。
- 然后我查看了git日志,发现这个服务的功能最早并不是用mybatis-plus实现的,这就明了了,我开始怀疑问题可能是由于 Mapper 文件并不直接处理 IdType策略,而是依赖于数据库的主键生成机制。于是,我尝试使用baseMapper进行插入操作。
// 示例代码
@Autowired
private MyEntityMapper myEntityMapper;
// 使用baseMapper进行插入操作
MyEntity entity = new MyEntity();
entity.setName("John Doe");
myEntityMapper.insert(entity);神奇的事情发生了,使用 baseMapper 进行插入操作后,IdType 策略居然生效了!主键值按照配置的方式生成,问题解决了。
原因分析
经过对问题的排查和解决过程,我总结了以下原因:
- IdType策略在- Mapper文件中不会生效,是因为- MyBatis-Plus并不直接处理实体类的主键生成策略,而是依赖于数据库的主键生成机制。
- 使用baseMapper进行插入操作时MyBatis-Plus会在内部处理IdType策略,从而生效。
总结
- 这个问题的解决过程让我更深入地了解了 MyBatis-Plus的工作原理。当遇到 IdType 策略不生效的问题时,我们可以尝试使用baseMapper进行操作,同时需要手动配置Mapper文件中的主键生成策略。
- 通过持续的学习和不断地解决问题,我们能够更好地掌握工具和框架的使用,提高开发效率和代码质量。希望本文对遇到类似问题的读者有所帮助。










