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