mybatisplus使用雪花id通过swagger返回ID时精度丢失问题

在使用mybatisplus自带雪花的时候会发现返回的ID是19位的长度,因此在通过swagger页面展示的时候会发现后端返回的和页面展示的ID不一致问题。是因为精度丢失的问题。因此需要更改雪花ID的长度

在这里插入图片描述
在这里插入图片描述

跟踪进去:

在这里插入图片描述
发现是DefaultIdentifierGenerator类实现了IdentifierGenerator并重写了nextId方法,因此需要我们重写nextId方法

  • 进行重写:
package com.ssdl.config.automatic;import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator;
import com.ssdl.util.IdGenerator;
import org.springframework.stereotype.Component;@Component
public class CustomerIdGenerator implements IdentifierGenerator {@Overridepublic Number nextId(Object entity) {return IdGenerator.generateId();}
}
package com.ssdl.util;import java.util.Date;
import java.util.UUID;/*** compressed id generator, result id not great than 53bits before 2318-06-04.*/
public class IdGenerator {private static IdGenerator instance = new IdGenerator(0);public static IdGenerator initDefaultInstance(int machineId) {instance = new IdGenerator(machineId);return instance;}public static IdGenerator getInstance() {return instance;}public static long generateId() {return instance.nextId();}// total bits=53(max 2^53-1:9007199254740992-1)// private final static long TIME_BIT = 40; // max: 2318-06-04private final static long MACHINE_BIT = 5; // max 31private final static long SEQUENCE_BIT = 8; // 256/10ms/*** mask/max value*/private final static long MAX_MACHINE_NUM = -1L ^ (-1L << MACHINE_BIT);private final static long MAX_SEQUENCE = -1L ^ (-1L << SEQUENCE_BIT);private final static long MACHINE_LEFT = SEQUENCE_BIT;private final static long TIMESTMP_LEFT = MACHINE_BIT + SEQUENCE_BIT;private long machineId;private long sequence = 0L;private long lastStmp = -1L;private IdGenerator(long machineId) {if (machineId > MAX_MACHINE_NUM || machineId < 0) {throw new IllegalArgumentException("machineId can't be greater than " + MAX_MACHINE_NUM + " or less than 0");}this.machineId = machineId;}/*** generate new ID** @return*/public synchronized long nextId() {long currStmp = getTimestamp();if (currStmp < lastStmp) {throw new RuntimeException("Clock moved backwards.  Refusing to generate id");}if (currStmp == lastStmp) {sequence = (sequence + 1) & MAX_SEQUENCE;if (sequence == 0L) {currStmp = getNextTimestamp();}} else {sequence = 0L;}lastStmp = currStmp;return currStmp << TIMESTMP_LEFT //| machineId << MACHINE_LEFT //| sequence;}private long getNextTimestamp() {long mill = getTimestamp();while (mill <= lastStmp) {mill = getTimestamp();}return mill;}private long getTimestamp() {// per 10msreturn System.currentTimeMillis() / 10;// 10ms}public static Date parseIdTimestamp(long id) {return new Date((id >>> TIMESTMP_LEFT) * 10);}public static String uuid() {return UUID.randomUUID().toString().replaceAll("-", "");}
}

插曲:
在使用mybatisplus时自动插入创建时间之类的操作:

package com.ssdl.config.autoMatic;import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;import java.util.Date;@Component
public class MybatisHandler implements MetaObjectHandler {@Overridepublic void insertFill(MetaObject metaObject) {//属性名this.setFieldValByName("createTime", new Date(), metaObject);this.setFieldValByName("updateTime", new Date(), metaObject);this.setFieldValByName("isDel", 0, metaObject);this.setFieldValByName("createUser", "admin", metaObject);this.setFieldValByName("updateUser", "admin", metaObject);//this.setFieldValByName("createUser", SecureUtil.getUserId(), metaObject);//不维护create_user可以不使用这行代码}@Overridepublic void updateFill(MetaObject metaObject) {//属性名this.setFieldValByName("updateTime", new Date(), metaObject);this.setFieldValByName("updateUser", "admin", metaObject);//this.setFieldValByName("updateUser", SecureUtil.getUserId(), metaObject);}
}
	@TableId(value = "id",type = IdType.ASSIGN_ID)private Long id;/*** 进行新增或者更新操作时* Mybatis自动进行维护时间*/@TableField(fill= FieldFill.INSERT)private String createUser;@TableField(fill=FieldFill.INSERT)@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")private Date createTime;@TableField(fill=FieldFill.INSERT_UPDATE)@JsonIgnoreprivate String updateUser;@TableField(fill= INSERT_UPDATE)@JsonIgnoreprivate Date updateTime;@TableLogic@TableField(fill= FieldFill.INSERT)@JsonIgnoreprivate Integer isDel;

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入理解JVM虚拟机第三十三篇:详解JVM学习路线与内容回顾

😉😉 欢迎加入我们的学习交流群呀! ✅✅1:这是孙哥suns给大家的福利! ✨✨2:我们免费分享Netty、Dubbo、k8s、Mybatis、Spring等等很多应用和源码级别的高质量视频和笔记资料,你想学的我们这里都有! 🥭🥭3:QQ群:583783824 📚📚 工作VX:BigTreeJava 拉你…

基于urllib库的网页数据爬取

实验名称&#xff1a; 基于urllib库的网页数据爬取 实验目的及要求&#xff1a; 【实验目的】 通过本实验了解和掌握urllib库。 【实验要求】 1. 使用urllib库爬取百度搜索页面。 2. 使用urllib库获取百度搜索的关键字搜索结果&#xff08;关键字任选&#xff09;。 实验原理及…

孩子还是有一颗网安梦——Bandit通关教程:Level 15 → Level 16

&#x1f575;️‍♂️ 专栏《解密游戏-Bandit》 &#x1f310; 游戏官网&#xff1a; Bandit游戏 &#x1f3ae; 游戏简介&#xff1a; Bandit游戏专为网络安全初学者设计&#xff0c;通过一系列级别挑战玩家&#xff0c;从Level0开始&#xff0c;逐步学习基础命令行和安全概念…

WEB网页设计期末作业个人主页——基于HTML+CSS制作个人简介网站

这个个人主页是我在WEB网页设计课程期末作业中完成的。我使用HTML和CSS来制作这个网站&#xff0c;以介绍我自己和我的兴趣爱好。在这个网站上&#xff0c;您可以找到以下信息&#xff1a; 关于我自己的一些背景和个人信息 我的技能和工作经验 我所喜欢的一些书籍、电影和音…

CLIP 对比预训练 + 文字图像相似度:离奇调查,如何训练视觉大模型?

CLIP&#xff1a;如何训练视觉大模型&#xff1f; 对比预训练图像编码器文本编码器最大的亮点&#xff1a;zero-shot图像分类 CLIP论文地址&#xff1a;https://arxiv.org/pdf/2103.00020.pdf CLIP 对比学习 预训练 文字图像相似度。 对比预训练 传统方法训练视觉模型的方…

活动 | Mint Blockchain 赞助支持清迈 WAMOTOPIA 线下活动

在 2023 年的末尾&#xff0c;南洋清迈的土地上&#xff0c;瓦猫 2.0 正在从 Builders, Creators, Thinkers, Dreamers 的集体梦想中走来。新年到来之际&#xff0c;瓦猫社区即将在泰国清迈创造通往新世界的即兴 - 突现部落 Spontaneous pop-up Tribe&#xff1a;瓦猫托邦 Wamo…

JVM-11-运行时栈帧结构

“栈帧”&#xff08;Stack Frame&#xff09;则是用于支持虚拟机进行方法调用和方法执行背后的数据结构&#xff0c;它也是虚拟机运行时数据区中的虚拟机栈&#xff08;Virtual MachineStack&#xff09;的栈元素。 栈帧存储了方法的局部变量表、操作数栈、动态连接和方法返回…

【深度学习】序列生成模型(二):束搜索

文章目录 序列生成束搜索理论基础算法步骤python实现 序列生成 在进行最大似然估计训练后的模型 p θ ( x ∣ x 1 : ( t − 1 ) ) p_\theta(x | \mathbf{x}_{1:(t-1)}) pθ​(x∣x1:(t−1)​)&#xff0c;我们可以使用该模型进行序列生成。生成的过程是按照时间顺序逐步生成序…

掌动智能浅谈云网络流量分析的主要过程

在云计算时代&#xff0c;网络流量分析成为确保网络安全和性能的重要环节。随着企业和组织将应用和服务迁移到云平台&#xff0c;对云网络流量进行深入的分析变得至关重要。本文将介绍云网络流量分析的主要过程&#xff0c;以帮助读者更好地理解如何有效地监控和管理云环境中的…

C++笔记之system()用于在Qt中执行系统命令的习惯

C笔记之system()用于在Qt中执行系统命令的习惯 参考博文&#xff1a;qt-C笔记之std::tostring()、.toStdString()、.toLocal8Bit().constData()的使用场景 code review! 文章目录 C笔记之system()用于在Qt中执行系统命令的习惯一.一般我用的int system( const char *command…

Mybatis的插件运⾏原理,如何编写⼀个插件?

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…

优化问题笔记(2)

目录 3. 约束优化问题的全局解3.1 凸优化问题3.2 二次优化问题3.3 无约束二次优化问题3.4 一个典型的二次等式约束二次优化问题 Reference 3. 约束优化问题的全局解 3.1 凸优化问题 局部解成为全局解的一类重要的优化问题是所谓凸优化问题. 我们称优化问题 ( f , D ) (f,\ma…