mybatis-plus主键自增带来的问题!

若依框架下从mybatis升级到mybatis-plus后遇到的一些问题:

在建表时定义了主键自增初始值也设置为一个二位常数,但是经过mybatis-plus的主键自增注解后会生成一个长度为19位的主键id!

而且在看数据库结构主键自增的初始值也被更改为长度为19位的大数!

CREATE TABLE `bas_ship_certificate` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `sys_dept_id` int(10) unsigned NOT NULL COMMENT 'sys_dept表主键',
  `create_by` varchar(64) DEFAULT NULL COMMENT '创建者',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_by` varchar(64) DEFAULT NULL COMMENT '更新者',
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `del_flag` char(1) NOT NULL DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)',
  PRIMARY KEY (`id`)
) AUTO_INCREMENT = 85 AUTO_INCREMENT_MODE = 'ORDER' DEFAULT CHARSET = utf8mb4 ROW_FORMAT = DYNAMIC COMPRESSION = 'zstd_1.3.8' REPLICA_NUM = 1 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0 COMMENT = '船舶证书信息';

可以看得到这里的 AUTO_INCREMENT = 85 这里的自增初始值为85

java中的实体类注解为(这段是从mybatis之前的老框架中复制过来的代码):

@Data
@ApiModel(value = "ShipCertificate", description = " ship_certificate")
public class BasShipCertificate extends BaseEntity
{
    private static final long serialVersionUID = 1L;

    /** id */
    @NotNull(message = "修改时id不能为空", groups = {Update.class})
    @ApiModelProperty(value = "id")
    @TableId
    private Long id;


其中注意看 @TableId 这个就是主键id的注解

问题就出在这里,在mybatis中 @TableId 注解默认值与 mybatis-plus的 @TableId 默认值不同!

mybatis-plus的 @TableId 注解默认值为 ASSIGN_ID

查看源码官网介绍为

他是雪花算法,是根据地域时间等一些因素生成一个全球绝对唯一的id类型为number,同时在存入数据库时也会把数据库的结构改变,就是咱们之前提到的 AUTO_INCREMENT = 85 其中的85会变成一个19位的数字!

注意前端json传输数据时使用的number接收数字类型的数据的,最多能准确接收16位!然而雪花算法时19位!如果想解决可以参考这位博主的前端准确接收19位数字

不过咱们刚建的标其实还有很多解决办法,可以让mybatis-plus的主键自增按照mybatis的之间自增模式进行增长!

解决办法就是指定 @TableId 注解的类型

如下:

@Data
@ApiModel(value = "ShipCertificate", description = "船舶证书信息对象 ship_certificate")
public class BasShipCertificate extends BaseEntity
{
    private static final long serialVersionUID = 1L;

    /** id */
    @NotNull(message = "修改时id不能为空", groups = {Update.class})
    @ApiModelProperty(value = "id")
    @TableId(type = IdType.AUTO)
    private Long id;


指定 type = IdType.AUTO

查看源码官方介绍为:

设置成普通的这个就行了,会根据你创建数据库时的值进行递增!

有同学就会疑问了:我创建表的时候没有指定 AUTO_INCREMENT = 85 这个呀!

其实你不指定它默认是 AUTO_INCREMENT = 1

如果你时直接复制的别人的表结构 AUTO_INCREMENT = 85 这个属性也会复制过来。

全部评论

相关推荐

评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客企业服务