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 这个属性也会复制过来。

全部评论

相关推荐

(黑话警告⚠️:hc=岗位数量, mt=导师, ld=直属领导, cr=代码审查)25年1月,我加入了字节某前端团队,并期望能在这里待到秋招并尝试转正。然而,就在上周,ld 找我1v1,告诉我,我的能力和团队预期不太匹配,并和我劝退。晴天霹雳吗?肯定是有的。那一刻,脑子里嗡嗡作响,各种情绪翻涌。但冷静下来想想,这几个月,自己在能掌控的范围内,确实有不少地方做得不尽如人意。所以,我想把这段不算成功的经历复盘一下,希望能给同样在努力转正的你提个醒,避开我踩过的坑。一、ld 的要求要注意刚进组时,ld就和我聊过转正的事。我当时发问:“咱们这儿有hc 吗?” ld没直接回答,只是说:“看能力,能力到了...
牛客上的彭于晏:过来人告诉你,入职后要做的第一件事儿不是说主动找活儿做,你要先学会融入团队,摸清ld的性格,投其所好。然后才是展示你的能力,能力上可以说技术或者业务,以业务能力为主,技术能力为辅。优先保证自己对业务需求的开发保证质量效率,然后再谈技术的问题,不要你觉得啥啥啥不行就想着整体优化了(发现校招生最喜欢干这事儿),我工作快5年了发现搞这种的最后都没啥好的结果,产出没有还引入新的bug,校招或者实习的水平看到的问题别人看不到嘛?为什么别人不去搞?浪费时间还没收益的事儿不要去做,技术上的能力体现在对于一个新需求,在不符合现在业务发展的架构设计上,你能拿出好的技术方案同时能考虑到后续业务发展逐渐将技术架构引入合理的架构,这是一个漫长的过程而不是一次性的
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客企业服务