快速解决 MyBatis-Plus 中 ID 自增问题(推荐)

 更新时间:2025年02月07日 14:37:52   作者:迷迷的k  
本文介绍了MyBatis-Plus中自动生成ID过长导致的问题及解决方法,结合示例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧

MyBatis-Plus 中自动生成的 ID 过长,可能导致以下问题的出现:

  • 由于属性的 ID 是由 mp 内部的 UUID 生成,比如使用 Integer类型 将存不进去
  • 当后端传入 mp 雪花算法自动生成的 ID 时,前端接收的时候可能会导致精度的损失

问题一:由于属性的 ID 是由 mp 内部的 UUID 生成,比如使用 Integer类型 将存不进去

报错信息如下所示:

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

解决方法:

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

问题二:当后端传入 mp 雪花算法自动生成的 ID 时,前端接收的时候可能会导致精度的损失

解决方法:

第一步:

首先在对应的类的主键属性上,增加以下代码配置

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

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

这里的 @TableId 注解需要添加以下依赖:

这里的版本号最好与 mp 的主依赖的版本保持一致

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus</artifactId>
    <version>版本号</version>
</dependency>

第二步:

将之前的被自增长的ID数据删除

第三步:

在需要解决 mp 自增长的表中,执行以下语句

ALTER TABLE table_name AUTO_INCREMENT = value;
 

其中, table_name 是对应的表名,value 是你需要进行自增的 ID 值

比如:value 赋值为 2,则 mp 下次生成的 ID 则为2,即从 2 开始

自增主键与 UUID 的优缺点

自增主键:

这种方式是使用数据库提供的自增数值型字段作为自增主键

优点:

  • 数据库自动编号,速度快,而且是增量增长,按顺序存放,对于检索非常有利
  • 数字型,占用空间小,易排序,在程序中传递也方便
  • 如果通过非系统增加记录时,可以不用指定该字段,不用担心主键重复问题

缺点 :

  • 因为自动增长,在手动要插入指定ID的记录时会显得麻烦,尤其是当系统与其它系统集成时,需要数据导入时,很难保证原系统的ID不发生主键冲突(前提是老系统也是数字型的)
  • 如果经常有合并表的操作,就可能会出现主键重复的情况很难处理分布式存储的数据表
  • 数据量特别大时,会导致查询数据库操作变慢;此时需要进行数据库的水平拆分,划分到不同的数据库中,那么当添加数据时,每个表都会自增长,导致主键冲突

UUID:

优点:

能够保证独立性,程序可以在不同的数据库间迁移,效果不受影响;保证生成的ID不仅是表独立的,而且是库独立的,这点在你想切分数据库的时候尤为重要

缺点:

  • 比较占地方,和INT类型相比,存储一个UUID要花费更多的空间
  • 使用UUID后,URL显得冗长,不够友好
  • Join 操作性能比 int 要低
  • UUID做主键将会添加到表上的其他索引中,因此会降低性能

到此这篇关于解决 MyBatis-Plus 中 ID 自增问题的文章就介绍到这了,更多相关MyBatis-Plus ID 自增内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java实现为Word文档添加文档属性

    Java实现为Word文档添加文档属性

    Word文档的文档属性是一组用于描述文件本身及其内容的元数据,本文以客观方式介绍如何在Java项目中为Word文档添加文档属性,包含环境准备、代码示例和注意事项,适合开发者快速上手
    2026-03-03
  • 选择java的理由:java之父访谈实录

    选择java的理由:java之父访谈实录

    选择java的理由:java之父访谈实录...
    2006-12-12
  • 关于jar包增量更新分析

    关于jar包增量更新分析

    这篇文章主要介绍了关于jar包增量更新分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • LeetCode程序员面试题之无重复字符的最长子串

    LeetCode程序员面试题之无重复字符的最长子串

    Java计算无重复字符的最长子串是一种常见的字符串处理算法,它的目的是找出一个字符串中无重复字符的最长子串。该算法可以很好地解决一些字符串处理问题,比如寻找字符串中重复字符的位置,以及计算字符串中无重复字符的最长子串的长度。
    2023-02-02
  • Servlet文件的上传与下载详解

    Servlet文件的上传与下载详解

    很多朋友不清楚在Servlet中怎么上传下载文件,谈到这个问题,首先需要我们掌握开发servlet的步骤,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2022-06-06
  • 常用Maven库,镜像库及maven/gradle配置(小结)

    常用Maven库,镜像库及maven/gradle配置(小结)

    这篇文章主要介绍了常用Maven库,镜像库及maven/gradle配置(小结),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Spring Boot JDBC 连接数据库示例

    Spring Boot JDBC 连接数据库示例

    本篇文章主要介绍了Spring Boot JDBC 连接数据库示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • SpringCloud zookeeper作为注册中心使用介绍

    SpringCloud zookeeper作为注册中心使用介绍

    ZooKeeper由雅虎研究院开发,是Google Chubby的开源实现,后来托管到Apache,于2010年11月正式成为Apache的顶级项目。ZooKeeper是一个经典的分布式数据一致性解决方案,致力于为分布式应用提供一个高性能、高可用,且具有严格顺序访问控制能力的分布式协调服务
    2022-11-11
  • Springboot中使用Filter实现Header认证详解

    Springboot中使用Filter实现Header认证详解

    这篇文章主要介绍了Springboot中使用Filter实现Header认证详解,当在 web.xml 注册了一个 Filter 来对某个 Servlet 程序进行拦截处理时,它可以决定是否将请求继续传递给 Servlet 程序,以及对请求和响应消息是否进行修改,需要的朋友可以参考下
    2023-08-08
  • SpringBoot实现接口加密的五大技巧分享

    SpringBoot实现接口加密的五大技巧分享

    为了有效应对接口安全面临的挑战,接口加密作为一种至关重要的手段,能够将原始数据转化为密文进行传输,从而确保数据在传输过程中的机密性和完整性,本文将深入探讨SpringBoot接口加密的最佳实践,需要的朋友可以参考下
    2025-07-07

最新评论