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 {
   
    @Override
    public 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-04
    private final static long MACHINE_BIT = 5; // max 31
    private 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 10ms
        return 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 {
   
	@Override
	public 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可以不使用这行代码
	}
 
	@Override
	public 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)
    @JsonIgnore
    private String updateUser;

    @TableField(fill= INSERT_UPDATE)
    @JsonIgnore
    private Date updateTime;

    @TableLogic
    @TableField(fill= FieldFill.INSERT)
    @JsonIgnore
    private Integer isDel;

相关推荐

  1. vmware 使用scsi_id 获取ID返回

    2023-12-16 07:40:05       44 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-16 07:40:05       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-16 07:40:05       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-16 07:40:05       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-16 07:40:05       20 阅读

热门阅读

  1. 挑战52天学小猪佩奇笔记--day23

    2023-12-16 07:40:05       32 阅读
  2. 轻松入门:Python 中的 Scipy 库初探

    2023-12-16 07:40:05       32 阅读
  3. 23.12.15 《CLR via C#》 笔记8

    2023-12-16 07:40:05       40 阅读
  4. python在车载电子测试方面的应用笔记【1】

    2023-12-16 07:40:05       44 阅读
  5. springboot rabbitmq 发布订阅 广播模式

    2023-12-16 07:40:05       45 阅读
  6. k8s1.24+prometheus+grafana容器监控与告警

    2023-12-16 07:40:05       25 阅读
  7. 2-go-变量定义、类型、常量、函数

    2023-12-16 07:40:05       41 阅读
  8. flutter学习-day11-容器类组件

    2023-12-16 07:40:05       38 阅读
  9. 【Hadoop】WordCount源码分析

    2023-12-16 07:40:05       43 阅读
  10. Spring Boot中实现邮件推送

    2023-12-16 07:40:05       35 阅读
  11. 飞天使-实际运用安装rabbitmq

    2023-12-16 07:40:05       40 阅读