问题背景
- 在开发过程中,我们经常会使用 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
文件中的主键生成策略。 - 通过持续的学习和不断地解决问题,我们能够更好地掌握工具和框架的使用,提高开发效率和代码质量。希望本文对遇到类似问题的读者有所帮助。