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存储引擎的索引与记录结构是这样的:

其索引与记录的结构是这样的:

img

(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 "";    
    }  

  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

其中GenerationType包含四种策略:

public enum GenerationType{    
  //使用一个特定的数据库表格来保存主键。 
    TABLE,
  //根据底层数据库的序列来生成主键,条件是数据库支持序列。 
    SEQUENCE,
  //主键由数据库自动生成(主要是自动增长型) 
    IDENTITY,
  //主键由程序控制。
    AUTO;
<span class="token keyword">private</span> <span class="token function">GenerationType</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
<span class="token punctuation">}</span>

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

其中的AUTO类型,在指定主键时,如果不指定主键生成策略,默认为AUTO。

@Id # 默认生成策略为AUTO

 
 
  • 1

效果等同于

@Id  
@GeneratedValue(strategy = GenerationType.AUTO) 

 
 
  • 1
  • 2

由此可见,自动生成的id和注解没什么关系,那也许就是mybatis-plus的主键生成逻辑问题了。

通过去查询mybatis-plus的文档(文档链接:https://baomidou.gitee.io/mybatis-plus-doc/#/spring-boot)

在这里插入图片描述

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

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

在这里插入图片描述

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

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

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如何使用? 很高兴为您解答这个问题。为了使用MyBatis-Plus自动生成代码模板Controller,您需要遵循以下步骤: 1. 安装MyBatis-Plus插件。您可以在Maven中添加以下代码来添加MyBatis-Plus依赖项: ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.1</version> </dependency> ``` 2. 根据您的需要配置MyBatis-Plus。您可以在application.properties文件中添加以下配置: ```properties # 数据库连接 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://your-database-url:3306/your-database-name?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC spring.datasource.username=your-database-username spring.datasource.password=your-database-password # MyBatis-Plus配置 mybatis-plus.mapper-locations=classpath:mapper/*.xml mybatis-plus.type-aliases-package=com.example.demo.entity ``` 3. 在您的实体类中添加需要映射的数据库表。对于每个表,需要创建一个Java类,用于映射表中的数据。您可以使用MyBatis-Plus提供的注解来配置主键和字段的映射: ```java @Data @TableName("user") // 表名 public class User { @TableId(value = "id", type = IdType.AUTO) // 主键 private Long id; @TableField("name") // 字段 private String name; // 省略其他字段 } ``` 4. 使用MyBatis-Plus的代码生成器生成代码。MyBatis-Plus提供了一个代码生成器,该生成器可以根据您的实体类和数据库自动生成代码。您可以使用以下命令启动代码生成器: ```java import com.baomidou.mybatisplus.generator.AutoGenerator; public class CodeGenerator { public static void main(String[] args) { AutoGenerator mpg = new AutoGenerator(); // 定义包名和文件路径 // ... // 配置数据源 // ... // 配置生成策略 // ... // 配置模板 // ... mpg.execute(); } } ``` 5. 完成后,您将在指定的文件夹中看到生成的代码,包括实体类、Mapper接口、XML文件和Service类。 希望这能帮到您!如果您有任何其他问题,请随时问我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值