使用Mybatis-plus出现数据库id很大或者为负数情况排查解决

背景介绍

在使用 MyBatis-Plus 框架时,主键生成是一个常见的需求。MyBatis-Plus 提供了多种主键生成策略,其中包括数据库自增、UUID 和雪花算法。雪花算法因其在高并发场景下的高效性和唯一性而被广泛采用。然而,有时候开发者会遇到使用雪花算法生成的主键值异常大,甚至为负数的问题。

问题描述

在使用 MyBatis-Plus 时,如果主键生成策略设置为雪花算法,可能会遇到以下问题:

  • 新增记录时,生成的主键值异常大。
  • 有时候生成的主键值为负数。

这些问题会导致数据库主键冲突,影响系统的稳定性和数据的一致性。

原因分析

1. 代码未设置 @TableId 注解

在实体类中,如果主键字段没有正确设置 @TableId 注解,MyBatis-Plus 将无法正确识别主键生成策略,从而导致生成的主键值异常。

2. 字段类型设置不当

如果主键字段的类型设置为 Integer 或数据库字段类型设置为 INT,而主键生成策略设置为雪花算法,可能会导致生成的主键值超出 IntegerINT 的范围,从而生成负数。

3. 雪花算法参数配置不当

雪花算法生成的主键值由时间戳、机器标识和序列号组成。如果时间戳部分过大,或者机器标识和序列号部分配置不当,都会导致生成的主键值异常大。

4. 数据库表初始值设置不当

即使代码中正确设置了 @TableId 注解,如果数据库表的初始值设置不当,也会导致生成的主键值异常。例如,如果数据库表的 AUTO_INCREMENT 初始值设置得过大,后续插入的数据也会受到影响。

解决方案

1. 设置 @TableId 注解

确保在实体类中正确设置 @TableId 注解,并指定主键生成策略为雪花算法。例如:

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;public class User {@TableId(value = "id", type = IdType.ASSIGN_ID)private Long id;private String name;private String email;// getters and setters
}

2. 调整字段类型

确保主键字段的类型设置为 Long,并且数据库字段类型设置为 BIGINT,以避免生成的主键值超出范围。例如:

public class User {@TableId(value = "id", type = IdType.ASSIGN_ID)private Long id;private String name;private String email;// getters and setters
}

数据库字段类型设置为 BIGINT

CREATE TABLE users (id BIGINT NOT NULL AUTO_INCREMENT,name VARCHAR(255),email VARCHAR(255),PRIMARY KEY (id)
);

3. 检查雪花算法参数配置

确保雪花算法的参数配置合理。MyBatis-Plus 默认的雪花算法配置通常是合理的,但如果需要自定义参数,可以参考以下配置:

  global-config:dbConfig:# 主键类型# AUTO 自增 NONE 空 INPUT 用户输入 ASSIGN_ID 雪花 ASSIGN_UUID 唯一 UUIDidType: ASSIGN_ID

4. 调整数据库表初始值

如果数据库表的 AUTO_INCREMENT 初始值设置得过大,可以通过以下 SQL 语句将其调整为合理的值:

ALTER TABLE users AUTO_INCREMENT = 1;

5. 重启后台服务

在调整完代码和数据库配置后,重启后台服务以确保所有更改生效。

示例代码

实体类

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;public class User {@TableId(value = "id", type = IdType.ASSIGN_ID)private Long id;private String name;private String email;// getters and setters
}

映射文件

<mapper namespace="com.example.mapper.UserMapper"><insert id="insertUser">INSERT INTO users (name, email)VALUES (#{name}, #{email})</insert>
</mapper>

数据库配置

spring:datasource:url: jdbc:mysql://localhost:3306/mydatabaseusername: rootpassword: passworddriver-class-name: com.mysql.cj.jdbc.Driverglobal-config:dbConfig:# 主键类型# AUTO 自增 NONE 空 INPUT 用户输入 ASSIGN_ID 雪花 ASSIGN_UUID 唯一 UUIDidType: ASSIGN_ID

结论

通过正确设置 @TableId 注解、调整字段类型、检查雪花算法参数配置、调整数据库表初始值,并重启后台服务,可以有效解决使用 MyBatis-Plus 时生成的主键值异常大或为负数的问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/9809.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

安卓市场如何做APP的分发、推广?

今天主要跟大家分享一些分发、推广这块操作的内容以及对安卓用户的一些理解。 分发的日常生活&#xff1a;“某渠道怎样怎样&#xff0c;应用宝是不是要加点预算&#xff0c;OPPO是不是要加点预算&#xff0c;你的成本又高了&#xff0c;华为又掉注册&#xff0c;应用宝又掉注册…

基于JavaWeb的图书售卖网站(源码+部署+LW)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。今天给大家介绍一篇基于JavaWeb的图书售卖网…

高级 <HarmonyOS主题课>构建华为支付服务的课后习题

五色令人目盲&#xff1b; 五音令人耳聋&#xff1b; 五味令人口爽&#xff1b; 驰骋畋猎&#xff0c;令人心发狂&#xff1b; 难得之货&#xff0c;令人行妨&#xff1b; 是以圣人为腹不为目&#xff0c;故去彼取此。 本篇内容主要来自&#xff1a;<HarmonyOS主题课>构建…

python全栈开发《63.判断两个集合中是否有相同的元素》

目录 1.isdisjoint的功能2.isdisjoint的用法3.代码 1.isdisjoint的功能 判断两个集合是否包含相同的元素。如果没有&#xff0c;返回True&#xff1b;如果有&#xff0c;返回False。 2.isdisjoint的用法 a_set {name,xiaomu,xiaoming} b_set {xiaoming,xiaogang,xiaohong} re…

员工管理系统(python)

利用python的自定义函数以及循环函数写一个小的员工管理系统&#xff0c;以下是详细代码&#xff1a; # 定义一个空的员工列表&#xff0c;用于存储员工信息 list_ems []# 添加员工的函数 def add():# 提示用户输入员工的各项信息employee_id input("请输入员工的工号&…

做AI大模型应用层产品研发,基本绕不开这几个大模型API

国内有不少独立模型厂商提供 API 可供调用&#xff0c;几乎都会成为技术选择的可选项&#xff1a; Moonshot AI&#xff1a; API 特点&#xff1a;其 API 与 OpenAI 兼容&#xff0c;方便开发者平滑迁移&#xff0c;开发者无需对代码做除基本参数外的“额外”修改&#xff0c;…

MySQL数据库专栏(五)连接MySQL数据库C API篇

摘要 本篇文章主要介绍通过C语言API接口链接MySQL数据库&#xff0c;各接口功能及使用方式&#xff0c;辅助类的封装及调用实例&#xff0c;可以直接移植到项目里面使用。 目录 1、环境配置 1.1、添加头文件 1.2、添加库目录 2、接口介绍 2.1、MySql初始化及数据清理 2.1.…

Ubuntu系统被木马程序攻击,运行莫名进程杀掉又自动重启解决办法

问题&#xff1a;Ubuntu系统被攻击了&#xff0c;有莫名进程运行杀掉又自动重启。 原因&#xff1a;攻击原因估计是用户名和密码过于简单&#xff0c;ssh服务穿透时等被暴力破解了。 nvidia-smi&#xff1a;存在莫名的./java程序&#xff0c;kill掉也会重启其它木马进程&#…

Java基于SpringBoot+Vue框架的宠物寄养系统(V2.0),附源码,文档

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

【MySQL】函数

3.函数 MySQL中的函数主要分为以下四类&#xff1a; 字符串函数、数值函数、日期函数、流程函数。 3.1 字符串函数 演示如下&#xff1a; A. concat : 字符串拼接 select concat(Hello , MySQL);B. lower : 全部转小写 select lower(Hello);C. upper : 全部转大写 select…

Android笔记(三十五):用责任链模式封装一个App首页Dialog管理工具

背景 项目需要在首页弹一系列弹窗&#xff0c;每个弹窗是否弹出都有自己的策略&#xff0c;以及哪个优先弹出&#xff0c;哪个在上一个关闭后再弹出&#xff0c;为了更好管理&#xff0c;于是封装了一个Dialog管理工具 效果 整体采用责任链模块设计&#xff0c;控制优先级及弹…

【实战篇P2-5】手把手实现STM32+ESP8266+原子云服务器+手机APP应用——第五节-编写Android手机APP程序实现接入原子云服务器

使用的开发软件是Android studio Android SDK(运行环境 :最低版本 21(Android 5.0) 最高版本 29 (Android 9.0) Gradle 版本 :4.6 根据源码,可自定义修改界面,修改名称,根据需求自定义数据展示界面等,修改app图标及名称等。 目录 Android程序设计 Android…

2024双十一数码好物推荐?双十一超值数码好物汇总别错过!

随着2024年双十一购物狂欢节临近尾声&#xff0c;各大电商平台的促销活动已经进入了最后的冲刺阶段。在这场年度最大的购物盛宴中&#xff0c;数码产品无疑是消费者关注的焦点。无论是提升工作效率的电脑、平板&#xff0c;还是丰富娱乐生活的手机、耳机&#xff0c;各大品牌纷…

Android V 挂起线程超时导致system_server挂掉

问题背景 最近Android v的平台频繁爆monkey异常停止的问题,分析到根因不是频繁dump堆栈导致system_server挂掉就是三方应用进程内部死锁导致anr,然后system_server挂起线程超时,system_server就崩了。 解决方案 先来看看anr导致死锁的场景如何分析 从log来看确认为syste…

评估 机器学习 回归模型 的性能和准确度

回归 是一种常用的预测模型&#xff0c;用于预测一个连续因变量和一个或多个自变量之间的关系。 那么&#xff0c;最后评估 回归模型 的性能和准确度非常重要&#xff0c;可以帮助我们判断模型是否有效并进行改进。 接下来&#xff0c;和大家分享如何评估 回归模型 的性能和准…

图片循环轮播,悬停停止

可直接执行HTML 代码 template 代码在下面 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Swip…

Transformer介绍(一)

Transformer是一种特殊的神经网络&#xff0c;一种机器学习模型。 谷歌在2017年推出的原版Transformer&#xff0c;论文《Attention Is All You Need》&#xff0c;专注于将一种语言的文本翻译成另一种。 而我们要关注的Transformer变种&#xff0c;即构建ChatGPT等工具的模型…

MySQL之索引(1)(索引概念与作用、红黑树、b树、b+树)(面试高频)

目录 一、索引的概念、作用。 &#xff08;1&#xff09;介绍。 &#xff08;2&#xff09;为啥索引能优化sql查询&#xff1f; 1、某张表(emp)结构以及数据如下。 2、假如执行的SQL语句为&#xff1a;select * from emp where empno7844; 3、对比与总结。 &#xff08;3&#…

pytest+request+allure接口自动化框架搭建分享

介绍分享一个接口自动化框架搭建方法 (pytestrequestallure)&#xff0c;这个方案是由 xpcs 同学在TesterHome社区网站的分享。 写在前面 去年11月被裁&#xff0c;到现在还没上岸&#xff0c;gap 半年了。上岸无望&#xff0c;专业技能不能落下&#xff0c;花了两三天时间&…

Linux之gdb的收尾部分

Linux之gdb的收尾部分 gbc常见指令的使用 gdb的调试