MybatisPlus使用@TableId主键id自增长无效如何解决
更新时间:2023-10-21问题背景:
MybatisPlus是基于Mybatis框架的增强工具,它简化了数据库操作的流程,提供了一系列的增删改查方法,使得开发更加高效。在使用MybatisPlus的过程中,我们常常会遇到一些问题,比如使用@TableId注解标注的主键id自增长无效的情况。下面我们来分析一下这个问题,并提出解决方案。
问题分析:
当我们在实体类中使用MybatisPlus提供的@TableId注解标注主键字段时,默认情况下,它会使用雪花算法(SnowFlake)来生成全局唯一的主键。如果我们的主键字段是Long类型,那么就会自动使用雪花算法生成主键值。但是,有时我们希望将主键设置为自增长的方式,即使用数据库的自增长策略生成主键。那么该怎么办呢?下面我们来介绍解决方案。
解决方案:
要解决MybatisPlus使用@TableId主键id自增长无效的问题,我们可以采取以下两种方式。
方式一:使用数据库自增长策略
我们可以在数据库中将主键字段设置为自增长的类型,比如MySQL中的自增长字段类型可以使用AUTO_INCREMENT关键字,Oracle中可以使用序列(Sequence)类型。然后,在实体类中的主键字段上使用注解@TableField填充策略为FieldStrategy.NOT_INSERT,并且指定主键生成器为ASSIGN_ID,如下所示:
@TableId(type = IdType.INPUT) @Tablefield(fill = FieldStrategy.NOT_INSERT, insertStrategy = FieldStrategy.NOT_INSERT) @TableGenerator(type = IdType.ASSIGN_ID) private Long id;
通过上述配置,我们告诉MybatisPlus主键的生成方式是通过ASSIGN_ID方式,也就是依赖数据库自增长策略生成主键值。同时,我们指定在插入数据时不插入主键值,而是由数据库自动生成。
方式二:使用数据库自增序列策略
如果我们的数据库中使用的是序列(Sequence)作为主键生成策略,那么可以采取以下方式。首先,在实体类中的主键字段上使用注解@TableField填充策略为FieldStrategy.NOT_INSERT,并且指定主键生成器为ASSIGN_ID,如下所示:
@TableId(type = IdType.INPUT) @Tablefield(fill = FieldStrategy.NOT_INSERT, insertStrategy = FieldStrategy.NOT_INSERT) @TableSeq(value = "SEQ_ID", clazz = Long.class, seqName = "TEST_SEQ") private Long id;
通过上述配置,我们告诉MybatisPlus主键的生成方式是通过ASSIGN_ID方式,也就是依赖数据库序列生成主键值。同时,我们指定在插入数据时不插入主键值,而是由数据库序列生成。
总结:
通过以上两种方式,我们可以解决MybatisPlus使用@TableId主键id自增长无效的问题。方式一适用于MySQL等支持自增长字段的数据库,方式二适用于使用序列作为主键生成策略的数据库。根据具体的业务需求和环境配置,选择合适的方式来解决该问题。