千家信息网

怎么解决Mybatis-Plus自动生成的数据库id过长问题

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,这篇文章主要讲解了"怎么解决Mybatis-Plus自动生成的数据库id过长问题",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"怎么解决Mybatis-
千家信息网最后更新 2026年10月31日怎么解决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;            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的文档

发现mybatis-plus默认的主键生成是全局唯一的UUID,会导致生成的id过长。

并且官方也提供了解决方法,如下图

可这只是将防止了前端接收时的精度丢失,并没有解决我的问题。

根据文档,可以得出一个新的解决办法,并且不用更改DO类代码:

将文档中所说的id-type配置设置为0即可。

Mybatis-Plus id主键生成的问题

简要说明

由于mybatis-plus会自动插入一个id到实体对象, 不管你封装与否, 所以有时候导致一些意外的情况发生

默认是生成一个长数字字符串(编码不同可能结尾带有字母)

错误

ested exception is org.apache.ibatis.reflection.ReflectionException: Could not set property 'id' of 'class com.xxx' with value '1110423703487479810' Cause: java.lang.IllegalArgumentException: java.lang.ClassCastException@14041406

大致就是由于自动生成了一个id1110423703487479810, 但是无法放入到integer中

解决方案一

1. 修改id字段类型

将id字段类型改为long, 这样就能保证有足够位数放入生成的id

2. 调整数据库id字段类型

将数据库的id字段的长度(改为20位)

解决方案二

如果想要使用id自增的, 就需要把mybatis-plus这个id生成的功能给关掉

添加注解

在id字段上加上如下注解即可

@TableId(value = "id",type = IdType.AUTO)

其他type类型介绍

  • AUTO:AUTO(0, "数据库ID自增"),

  • INPUT:INPUT(1, "用户输入ID"),

  • ID_WORKER:ID_WORKER(2, "全局唯一ID"),

  • UUID:UUID(3, "全局唯一ID"),

  • NONE:NONE(4, "该类型为未设置主键类型"),

  • ID_WORKER_STR:ID_WORKER_STR(5, "字符串全局唯一ID");

感谢各位的阅读,以上就是"怎么解决Mybatis-Plus自动生成的数据库id过长问题"的内容了,经过本文的学习后,相信大家对怎么解决Mybatis-Plus自动生成的数据库id过长问题这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

生成 数据 数据库 问题 自动生成 索引 类型 字段 存储 全局 就是 方案 注解 注释 解决方案 情况 文档 学习 位数 内容 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网和科技技术 互联网科技小贷 互联网科技股票 唐信互联网科技 大连 狮子座互联网科技培训 金融科技和互联网金融 中正互联网科技招聘 互联网科技公司需要的职位 互联网企业和科技型企业 栖莱科技互联网股份有限公司 科技类公司包括互联网吗 河南住房之家互联网科技 群盈汇互联网科技有限公司 上海创道互联网络科技有限公司 下一代互联网重大应用科技园 半导体行业属于互联网高科技类吗 国产互联网科技公司 中国互联网公司的科技投入 六子台科技互联网展会 互联网科技快速发展优美句子 广州淘业互联网络科技 互联网科技工作委员会主任 中国互联网科技股 互联网科技垄断 安徽鑫晟辉互联网科技 奇士达互联网科技 互联网科技有限公司 翻译 科技和互联网行业的特点 科技互联网公司两年变化 第三届互联网大会安防黑科技
0