Mybatis-Plus⾃动⽣成的数据库id过长的解决
⽬录
Mybatis-Plus⾃动⽣成的数据库id过长
⼀、问题
⼆、解决⽅案
三、原理
Mybatis-Plus id主键⽣成的问题
简要说明
错误
解决⽅案⼀
解决⽅案⼆
Mybatis-Plus⾃动⽣成的数据库id过长
⼀、问题
作为⼀名第⼀次使⽤mybatis-plus的萌新开发⼯程师,在项⽬开发过程中遇到⼀个问题。
当使⽤mybatis-plus⾃带的mybatis-generate⽣成DO⽂件,如下图所⽰
DO类由注释@Table修饰,主键id由注释@Id,@GeneratedValue修饰。但是使⽤这样的默认DO进⾏数据库操作时,会有导致数据库⾃动⽣成的主键id过长,如下所⽰
这样的19位id,会存在⼀些问题:
1)前端拿到这样的id后,会发⽣Number精度丢失,导致id数值发⽣变化,使得前后端的id不⼀致,这样就使得⽆法利⽤id进⾏操作
2)InnoDB存储引擎的索引与记录结构是这样的:
其索引与记录的结构是这样的:
(1)主键索引与记录存储在⼀起;InnoDB通过主键索引查询时,能够直接定位到⾏记录。
(2)普通索引存储主键(这下不是指针了);
这样当主键id是⼀个⽐较长的数值时每个索引都存储这个值,在数据量⼤,内存珍贵的情况下,MySQL有限的缓冲区,存储的索引与数据会减少,索引占⽤的磁盘空间也会增加,磁盘IO的概率会增加。
⼆、解决⽅案
通过询问各位师兄和开发同学,解决了这个问题,解决⽅案如下:
将DO类的注释改为@TableName,主键id的注释改为@TableId,这样⾃动⽣成的主键id就是正常位数。
⾄于为什么会这样,我通过查阅资料得出⼀下结论
三、原理
1.⾸先了解下@GeneratedValue的使⽤。@GeneratedValue属于JPA注解之⼀,JPA通过annotation来
映射hibernate实体,基于annotation的hibernate主键标识为@Id,其⽣成规则是由@GeneratedValue设定的。
JPA提供四种标准⽤法,由@GeneratedValue的源代码可以明显看出:
@Target({METHOD,FIELD})
@Retention(RUNTIME)
public @interface GeneratedValue{
GenerationType strategy() default AUTO;
jpa mybatis
String generator() default "";
}
其中GenerationType包含四种策略:
public enum GenerationType{
//使⽤⼀个特定的数据库表格来保存主键。
TABLE,
//根据底层数据库的序列来⽣成主键,条件是数据库⽀持序列。
SEQUENCE,
//主键由数据库⾃动⽣成(主要是⾃动增长型)
IDENTITY,
//主键由程序控制。
AUTO;
private GenerationType() {
}
}
其中的AUTO类型,在指定主键时,如果不指定主键⽣成策略,默认为AUTO。
@Id # 默认⽣成策略为AUTO
效果等同于
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
由此可见,⾃动⽣成的id和注解没什么关系,那也许就是mybatis-plus的主键⽣成逻辑问题了。
发现mybatis-plus默认的主键⽣成是全局唯⼀的UUID,会导致⽣成的id过长。并且官⽅也提供了解决⽅法,如下图
可这只是将防⽌了前端接收时的精度丢失,并没有解决我的问题。
根据⽂档,可以得出⼀个新的解决办法,并且不⽤更改DO类代码:
将⽂档中所说的id-type配置设置为0即可。
Mybatis-Plus id主键⽣成的问题
简要说明
由于mybatis-plus会⾃动插⼊⼀个id到实体对象, 不管你封装与否, 所以有时候导致⼀些意外的情况发⽣
默认是⽣成⼀个长数字字符串(编码不同可能结尾带有字母)
错误
ested exception is org.flection.ReflectionException: Could not set property 'id' of '' with value '1110423703487479810' Cause: java.lang.IllegalArgumentException:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。