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

embedded/2024/11/13 15:29:14/

背景介绍

在使用 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.ppmy.cn/embedded/136447.html

相关文章

从 HTTP 到 HTTPS 再到 HSTS:网站安全的演变与实践

近年来&#xff0c;随着域名劫持、信息泄漏等网络安全事件的频繁发生&#xff0c;网站安全变得越来越重要。这促使网络传输协议从 HTTP 发展到 HTTPS&#xff0c;再到 HSTS。本文将详细介绍这些协议的演变过程及其在实际应用中的重要性。 一、HTTP 协议 1.1 HTTP 简介 HTTP&…

大数据-216 数据挖掘 机器学习理论 - KMeans 基于轮廓系数来选择 n_clusters

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

Python: argparse模块

1. 导入模块和创建解析器 argparse 是 Python 标准库中用于命令行参数解析的模块。你首先需要导入 argparse&#xff0c;然后创建一个 ArgumentParser 对象&#xff0c;该对象将负责解析命令行参数。 &#xff08;感觉和Java中&#xff0c;main 方法的 String[] args有点像&am…

分组校验在Spring中的应用详解

目录 前言1. 什么是分组校验2. 分组校验的基本原理3. 分组校验的实现步骤3.1 定义分组接口3.2 在校验项中指定分组3.3 校验时指定要校验的分组3.4 默认分组和分组的继承 4. 分组校验的优势和适用场景4.1 优势4.2 适用场景 5. 常见问题与解决方案5.1 校验未生效5.2 无法识别默认…

[面试]关于Redis 的持久化你了解吗

Redis的持久化是指Redis服务器在关闭或重启时&#xff0c;将内存中的数据保存到磁盘上的一种机制。Redis支持多种持久化方式。 一、RDB&#xff08;Redis Database&#xff09;持久化 RDB持久化是Redis默认采用的持久化方式&#xff0c;它将Redis在某个时间点的数据保存到磁盘上…

QT模态对话框和非模态对话框区别以及常用标准对话框

QT模态对话框和非模态对话框区别以及常用标准对话框 1.概述 这篇文章介绍下对话框的分类&#xff0c;它分为模态对话框和非模态对话框。 模态对话框&#xff1a;打开对话框后&#xff0c;不能操作其他窗口 非模态对话框&#xff1a;打开对话框后&#xff0c;可以操作其他窗口…

Risc-v:mhartid寄存器

简介 mhartid&#xff08;Machine Hart ID Register&#xff09;是 RISC-V 架构中的一个控制和状态寄存器&#xff08;CSR&#xff09;&#xff0c;用于存储当前硬件线程&#xff08;hart&#xff09;的标识符。 在多核处理器中&#xff0c;每个核心可能有一个或多个硬件线程&a…

页面上的内容的生成图片后,保存为word,并下载

页面上的内容的生成图片后&#xff0c;保存为word&#xff0c;并下载 juqery <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Download Page Screenshot as Word</title><script src"h…