Mybatis-plus中,如何提前获取实体类用雪花算法生成的ID?

2023-10-27

Mybatis-plus中,通过设置@TableId可以让Mybatis-plus自动为我们生成雪花算法的ID号,该ID号是一个长整型数据,非常方便。但是雪花算法的ID号是在Insert执行的时候生成的,我们在Insert执行前是不知道Entity会获得一个什么ID号。

但是在某些情况下,我们想提前获取这个ID,这样可以通过一些计算来生成其他字段的值。例如我们用此ID号做秘钥来加密密码。

这种情况下,需要提前生成ID号,手动设置给Entity。在实体类中,通过下面这个注解将自动ID改为有程序控制输入:

 @TableId(type=IdType.INPUT)

那么我们需要用雪花算法生成一个ID号。是不是还需要另外自己写一个雪花算法生成类呢?

完全不用。因为Mybatis-plus中内置了雪花算法生成功能,我们找出来调用就行了,就是下面这个类:

import com.baomidou.mybatisplus.core.toolkit.IdWorker;

我们可以这样调用:

Long ID=IdWorker.getId(entity);

如果有更高的需求,还可以设置雪花算法的其他参数。

这个类源码如下:

/*
 * Copyright (c) 2011-2020, baomidou (jobob@qq.com).
 * <p>
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * <p>
 * https://www.apache.org/licenses/LICENSE-2.0
 * <p>
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package com.baomidou.mybatisplus.core.toolkit;

import com.baomidou.mybatisplus.core.config.GlobalConfig;
import com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator;
import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.UUID;
import java.util.concurrent.ThreadLocalRandom;

/**
 * id 获取器
 *
 * @author hubin
 * @since 2016-08-01
 */
public class IdWorker {

    /**
     * 主机和进程的机器码
     */
    private static IdentifierGenerator IDENTIFIER_GENERATOR = new DefaultIdentifierGenerator();

    /**
     * 毫秒格式化时间
     */
    public static final DateTimeFormatter MILLISECOND = DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS");

    /**
     * 获取唯一ID
     *
     * @return id
     */
    public static long getId() {
        return getId(new Object());
    }

    /**
     * 获取唯一ID
     *
     * @return id
     */
    public static long getId(Object entity) {
        return IDENTIFIER_GENERATOR.nextId(entity).longValue();
    }

    /**
     * 获取唯一ID
     *
     * @return id
     */
    public static String getIdStr() {
        return getIdStr(new Object());
    }

    /**
     * 获取唯一ID
     *
     * @return id
     */
    public static String getIdStr(Object entity) {
        return IDENTIFIER_GENERATOR.nextId(entity).toString();
    }

    /**
     * 格式化的毫秒时间
     */
    public static String getMillisecond() {
        return LocalDateTime.now().format(MILLISECOND);
    }

    /**
     * 时间 ID = Time + ID
     * <p>例如:可用于商品订单 ID</p>
     */
    public static String getTimeId() {
        return getMillisecond() + getIdStr();
    }

    /**
     * 有参构造器
     *
     * @param workerId     工作机器 ID
     * @param dataCenterId 序列号
     * @see #setIdentifierGenerator(IdentifierGenerator)
     */
    public static void initSequence(long workerId, long dataCenterId) {
        IDENTIFIER_GENERATOR = new DefaultIdentifierGenerator(workerId, dataCenterId);
    }

    /**
     * 自定义id 生成方式
     *
     * @param identifierGenerator id 生成器
     * @see GlobalConfig#setIdentifierGenerator(IdentifierGenerator)
     */
    public static void setIdentifierGenerator(IdentifierGenerator identifierGenerator) {
        IDENTIFIER_GENERATOR = identifierGenerator;
    }

    /**
     * 使用ThreadLocalRandom获取UUID获取更优的效果 去掉"-"
     */
    public static String get32UUID() {
        ThreadLocalRandom random = ThreadLocalRandom.current();
        return new UUID(random.nextLong(), random.nextLong()).toString().replace(StringPool.DASH, StringPool.EMPTY);
    }
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mybatis-plus中,如何提前获取实体类用雪花算法生成的ID? 的相关文章

随机推荐

  • Leetcode309:最佳买卖股票时机含冷冻期

    给定一个整数数组 其中第 i 个元素代表了第 i 天的股票价格 设计一个算法计算出最大利润 在满足以下约束条件下 你可以尽可能地完成更多的交易 多次买卖一支股票 你不能同时参与多笔交易 你必须在再次购买前出售掉之前的股票 卖出股票后 你无法
  • 系列:1、Kubernetes 简介

    Kubernetes 简介 1 什么是Kubernetes 根据文档中的定义 Kubernetes 是一种便携式 可扩展 开源的平台 该平台可管理容器化的任务负载以及服务 有助于声明式配置以及自动化运维管理 Kubernetes 又缩写为
  • 安卓期末大作业Android studio-记单词app(资源链接在文末,含注册登录,含设计报告,含导出app文件及源码导入方法文档)

    安卓期末大作业Android studio 记单词app 注册登录 增删改查 资源下载链接在文末 1 注册登录界面 2 用户点击加号按钮输入单词 键盘会自动弹出并焦点在输入框 用户输入英文和中文释义 单词本上将在最上面显示这个单词 并会有下
  • 认识项目管理

    目前 随着IT项目规模和复杂性不断提高 尤其是一个软件项目 它成功的关键点已从原来的技术上转移到管理上 目前 政府 企业 大公司包括一些小公司和个人也逐渐意识到项目管理的重要性 但是现今国外内项目成功率都不高 据斯坦迪什咨询集团的调查数据
  • MSP430单片机GPIO编程入门教程

    在本教程中 我们将一起学习MSP430单片机GPIO的编程方法 本文也适用于Launchpad开发板上使用的MSP430x2xx器件 如MSP430G2553 MSP430G2231等 MSP430单片机上的大多数引脚被分组为最多8个端口
  • 花生壳实现内网穿透,获取公网IP?花生壳端口映射外网TCP测试

    什么是内网穿透 内网穿透即NAT穿透 内网穿透可以让你局域网中的电脑实现外网访问功能 例如我公司电脑上运行了一个linux虚拟主机 安装SSH服务后我就可以在整个局域网内 连接192 168 xx xx去操作这台linux主机 但这只局限于
  • Python_Socket_接送来自客户端的数据出现乱码

    最新在学python 问题有很多 但过程还算美好 有问题都及时解决了 下面附上碰到的用网络调试助手发送中文 服务端接收乱码解决思路 这个网络调试助手的默认编码格式应该是gbk 所以解码的时候用格式用gbk 下面是服务端接收信息的代码 imp
  • Redis基础及与springboot整合

    安装redis 下载redis 百度就有 上传到centos linux下安装gcc环境 yum install gcc 解压redis安装包 tar zxvf redis xxx xx tar 编译和安装解压好的redis cd stud
  • Centos8安装MySQL

    受苦于博客总是过于老旧 安装时总会出现版本包已经删除的情况而且步骤总是各式各样难以理解 无奈之下还是官网靠谱 于是这篇博客以官网方法为基准 方便以后安装的时候可以直接复制命令 一 官网教程 https dev mysql com doc r
  • STM32毕业设计选题汇总

    文章目录 1前言 2 STM32 毕设课题 3 如何选题 3 1 不要给自己挖坑 3 2 难度把控 3 3 如何命名题目 1前言 更新单片机嵌入式选题后 不少学弟学妹催学长更新STM32和C51选题系列 感谢大家的认可 来啦 以下是学长亲手
  • python通过docker打包执行

    背景 正常情况下 python脚本执行需要安装有python环境 那python环境虽然也可以通过移植的方法来安装 那总归是比较麻烦的 下面通过docker打包的方式来执行python脚本 1 安装python镜像 准备两个文件即可 doc
  • 前端LayUI框架快速上手实现登入注册

    目录 一 Layui简介 1 什么是LayUI 2 LayUI的特点 二 LayUI入门 1 LayUI下载 2 LayUI入门使用 2 1 在web项目中导入LayUI文件中的layui文件 2 2 在JSP页面引入css js文件 2
  • linux建立虚拟内存,如何在Linux环境下建立虚拟内存

    虚拟内存是将硬盘规划出一个区间用来读取数据的空间 但是有很多用户们都不知道Linux环境下如何建立虚拟内存 那么现在我们就一起跟小编去看看具体内容吧 在Linux 下就是建立swap file 基本步骤 先建立swap这个装置或是档案后 将
  • Java程序员到架构师的推荐阅读书籍

    Java程序员到架构师的推荐阅读书籍 作为Java程序员来说 最痛苦的事情莫过于可以选择的范围太广 可以读的书太多 往往容易无所适从 我想就我自己读过的技术书籍中挑选出来一些 按照学习的先后顺序 推荐给大家 特别是那些想不断提高自己技术水平
  • Python文件读写

    Python的文件操作函数 open filename mode 文件打开模式 执行操作 r 以只读方式打开 默认 w 以写入的方式打开文件 会覆盖已经存在的文件 x 如果指定文件已经存在 使用此模式打开将引发异常 a 以写入模式打开 如果
  • 分治法求解汉诺塔问题

    汉诺塔问题简介 汉诺塔 又称河内塔 问题是源于印度一个古老传说的益智玩具 大梵天创造世界的时候做了三根金刚石柱子 在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘 大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上 并且规定
  • GD32E230使用J-LINK下载调试问题

    1 无法识别到GD32的芯片 j link的版本要V9的才行 也就是下图的HW版本V9 4 之前是V7一直无法识别 换成V9的j link之后就可以了 2 打开J link的setting时弹出盗版警告 Warning the connec
  • Dialog居中显示

    最新使用Dialog时 发现在以下低版本系统中会出现Dialog弹窗在左上角显示的情况 搜索了一下 发现了这个方法 记录一下 dialog 居中显示 Window window dialog getWindow if dialog null
  • C++中私有变量的值想怎么改就怎么改

    这应该算是C 的一个不足吧 C 是优秀的编程语言 但不是完美的 include
  • Mybatis-plus中,如何提前获取实体类用雪花算法生成的ID?

    Mybatis plus中 通过设置 TableId可以让Mybatis plus自动为我们生成雪花算法的ID号 该ID号是一个长整型数据 非常方便 但是雪花算法的ID号是在Insert执行的时候生成的 我们在Insert执行前是不知道En