问题出现前提:
先说场景:PostgreSQL里给表字段设了自增,Spring Boot项目集成了MyBatis-Plus,然后往里插数据。
现象很让人头疼:数据库里的那个自增字段,死活没按预想递增,而且跳得毫无规律。
来看项目里的实体类长什么样:

这里的 id,就是本该自增的字段。
整个设置字段自增的过程
PostgreSQL的自增依赖序列(Sequence),所以得先搞一个序列出来。
步骤一、新增序列
CREATE SEQUENCE test_fdfs.stu_id_seq START WITH 1 INCREMENT BY 1 MINVALUE 1 NO MAXVALUE CACHE 1;
步骤二、设置表字段应用该序列
ALTER TABLE stu ALTER COLUMN id SET DEFAULT nextval('test_fdfs.stu_id_seq'::regclass);
现象
操作完,信心满满地新增两条数据,结果id既没从1开始,也没递增。

这时候自然就怀疑:是不是MyBatis-Plus的主键生成策略跟PostgreSQL的自增序列打架了?到网上翻了一圈,发现类似案例不多,资料比较零散。
最终尝试在实体类的id字段上加一个MyBatis-Plus的注解:

重启项目,再插入数据——哎,解决了!

顺着这个线索,去翻了翻 IdType.AUTO、IdType.NONE、IdType.INPUT 的区别:
IdType.AUTO:不用MyBatis-Plus的自增策略,使用数据库的自增策略,数据库自动为新记录生成唯一ID。 IdType.NONE:未设置主键类型(注解里等于跟随全局,全局里约等于INPUT),默认值。 IdType.INPUT:需要显式设置id。
总结
要在集成了MyBatis-Plus的Spring Boot项目中使用数据库自身的字段自增策略,关键就是在实体类的主键字段上加上这个注解:
@TableId(type = IdType.AUTO)
