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;
        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的文档(文档链接:https://baomidou.gitee.io/mybatis-plus-doc/#/spring-boot

发现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”);

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • mybatis-plus主键id生成、字段自动填充的实现代码

    一.主键id的生成 数据库表里通常都会有一个主键id,来作为这条数据的唯一标识. 常见的方式 1.数据库自动增长 这种很常见了,可以做到全库唯一.因为id是天然排序的,对于涉及到排序的操作会很方便. 2.UUID 上面的自动增长,虽然简单,但是对于分表这样的操作来说就比较麻烦.因为你在第二张插入数据的时候,需要拿到上一张表最后一个数据的id. UUID则不同,每次都一个随机唯一的值,不过因为是随机,所以也就没有排序了. 3.redis redis也可以用来生成id,利用redis的原子操作.好处

  • 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: ja

  • mybatis-plus IdWorker生成的Id和返回给前台的不一致的解决

    问题描述 今天在公司项目中修改id的生成策略为mybatis-plus自带的IdWorker策略时,发现返回给前台的id竟然和数据库不一致.费解得很呐. package net.mshome.twisted.tmall.entity; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatis

  • Mybatis-Plus自动生成的数据库id过长的解决

    目录 Mybatis-Plus自动生成的数据库id过长 一.问题 二.解决方案 三.原理 Mybatis-Plus id主键生成的问题 简要说明 错误 解决方案一 解决方案二 Mybatis-Plus自动生成的数据库id过长 一.问题 作为一名第一次使用mybatis-plus的萌新开发工程师,在项目开发过程中遇到一个问题. 当使用mybatis-plus自带的mybatis-generate生成DO文件,如下图所示 DO类由注释@Table修饰,主键id由注释@Id,@GeneratedVal

  • Mybatis Generator自动生成对应文件的实现方法

    使用Generator自动生成我们需要的bean dao mapper xml等文件的过程(没有借助eclipse等编辑工具直接命令提示符生成) 第一步:在E盘新建一个文件夹generator,在这文件夹下创建一个test文件夹用来存放生成的文件,在创建一个generator.xml的配置文件 第二步:导入需要的jar包 mybatis-generator-core-1.3.2.jar 和mysql-connector-java-5.1.28-bin.jar 第三步:编写generator.xm

  • MyBatis框架之mybatis逆向工程自动生成代码

    Mybatis属于半自动ORM,在使用这个框架中,工作量最大的就是书写Mapping的映射文件,由于手动书写很容易出错,我们可以利用Mybatis-Generator来帮我们自动生成文件. 逆向工程 1.什么是逆向工程 mybaits需要程序员自己编写sql语句,mybatis官方提供逆向工程 可以针对单表自动生成mybatis执行所需要的代码(mapper.java,mapper.xml.po..) 企业实际开发中,常用的逆向工程方式: 由于数据库的表生成java代码. 2.下载逆向工程 my

  • Spring和MyBatis整合自动生成代码里面text类型遇到的坑

    Spring和MyBatis整合以后,使用自动生成代码工具生成dao和mapper配置文件,生成步骤如下(以Intelli idea为例). 1.编写生成代码配置文件generatorConfig.xml. <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator

  • Spring Boot整合mybatis并自动生成mapper和实体实例解析

    最近一直都在学习Java,发现目前Java招聘中,mybatis出现的频率挺高的,可能是目前Java开发中使用比较多的数据库ORM框架.于是我准备研究下Spring Boot和mybatis的整合. 1.在pom.xml文件中添加下面的配置 <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-

  • IDEA Maven Mybatis generator 自动生成代码(实例讲解)

    IDEA Maven Mybatis generator 自动生成代码的实例讲解 一.安装配置maven以及在Idea中配置maven 安装过程步骤可以看上面的博文,里面介绍得很详细. 二.建数据表 DROP TABLE IF EXISTS `t_user`; CREATE TABLE `t_user` ( `id` varchar(100) NOT NULL, `username` varchar(20) DEFAULT NULL, `password` varchar(20) DEFAULT

  • IDEA MyBatis Plugins自动生成实体类和mapper.xml

    前言 如何下载和使用MyBatis Generator 插件,只说代码,不讲感情.如果有问题还请多多指点. 开发环境 开发工具:IntelliJ IDEA 2018.1.1 x64 dk版本:1.8.0_171 工程构建工具:maven 版本3.2.5 数据库 mysql IDEA 下载MyBatis Generator 插件 1.首先在File--Settings--点击Plugins,搜索框中搜索mybatis,选择mybatis-plugins,点击安装(由于我的已经安装过,所以没有绿色的

  • SpringBoot整合Mybatis Generator自动生成代码

    目录 1.创建SpringBoot项目 2. mybatis-generator-maven插件的配置 3. 项目结构构建 4. application.yml配置 5. generatorConfig.xml配置 7. 选择 Mybatis Generator 启动,自动在dao.entity.mapper包下生成代码 Mybatis是目前主流的ORM框架,相比于hibernate的全自动,它是半自动化需要手写sql语句.接口.实体对象,后来推出的Generator自动生成代码,可以帮我们提高

  • Springboot Mybatis Plus自动生成工具类详解代码

    前言 代码生成器,也叫逆向工程,是根据数据库里的表结构,自动生成对应的实体类.映射文件和接口. 看到很多小伙伴在为数据库生成实体类发愁,现分享给大家,提高开发效率. 一.pom依赖 <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.1</version> &

  • mybatis plus自动生成代码的示例代码

    写一个简单的mybatis plus插件自动生成代码的例子 pom.xml 添加配置 <!-- mybatis plus 插件--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.1</version> </dependency>

随机推荐