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

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);
    }
}

到此这篇关于Mybatis-plus如何提前获取实体类用雪花算法生成的ID的文章就介绍到这了,更多相关Mybatis-plus获取雪花算法生成ID内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • mybatis-plus雪花算法自动生成机器id原理及源码

    1.雪花算法原理 雪花算法使用一个 64 bit 的 long 型的数字作为全局唯一 id.这 64 个 bit 中,其中 1 个 bit 是不用的,然后用其中的 41 bit 作为毫秒数,用 10 bit 作为工作机器 id,12 bit 作为序列号. 1bit,不用,因为二进制中最高位是符号位,1表示负数,0表示正数.生成的id一般都是用整数,所以最高位固定为0. 41bit-时间戳,用来记录时间戳,毫秒级. 10bit-工作机器id,用来记录工作机器id. 12bit-序列号,序列号,用来

  • mybatis-plus雪花算法生成Id使用详解

    目录 前言 一.mybatis-plus官网 二.雪花算法实战 三.实现分析 四.为什么默认就是雪花算法 五.主动设置Id生成策略 总结 前言 在实际开发过程中,数据库自增主键生成Id能满足大部分的场景.但是随着分布式应用场景的增多,表数据的增大导致分表分库的大量应用.数据库自增主键的生成规则无法满足对应的业务场景,于是诞生了越来越多的分布式ID生成算法,其中雪花算法是目前最为流行的.今天说一下在mybatis-plus中如何使用雪花算法生成Id. 一.mybatis-plus官网 官方文档:h

  • mybatis-plus雪花算法增强idworker的实现

    目录 一.官网 二.默认实现的弊端 三.mybatis-plus中datacenterId和workerId的默认生成规则 四.idworker介绍 五.idworker实战 总结 一.官网 官方文档:https://baomidou.com/ Git地址:https://github.com/baomidou/mybatis-plus idworker官网:https://github.com/imadcn/idworker TIP️:推荐学习框架的时候,多研究下官网,获取第一手资料. 二.默

  • mybatis-plus 如何使用雪花算法ID生成策略

    目录 mybatis-plus 可以通过@TableId注解指定主键生成策略 看一下源码大概找一下雪花算法的实现方式 自定义ID生成器实现 Mybatis-plus 中生成雪花算法id的工具类 mybatis-plus 可以通过@TableId注解指定主键生成策略 @TableId(value="id",type=IdType.ASSIGN_ID) 值 描述 AUTO 数据库ID自增 NONE 无状态,该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT) INPUT

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

    Mybatis-plus中,通过设置@TableId可以让Mybatis-plus自动为我们生成雪花算法的ID号,该ID号是一个长整型数据,非常方便.但是雪花算法的ID号是在Insert执行的时候生成的,我们在Insert执行前是不知道Entity会获得一个什么ID号. 但是在某些情况下,我们想提前获取这个ID,这样可以通过一些计算来生成其他字段的值.例如我们用此ID号做秘钥来加密密码. 这种情况下,需要提前生成ID号,手动设置给Entity.在实体类中,通过下面这个注解将自动ID改为有程序控制

  • C#编程获取实体类属性名和值的方法示例

    本文实例讲述了C#编程获取实体类属性名和值的方法.分享给大家供大家参考,具体如下: 遍历获得一个实体类的所有属性名,以及该类的所有属性的值 //先定义一个类: public class User { public string name { get; set; } public string gender { get; set; } public string age { get; set; } } //实例化类,并给实列化对像的属性赋值: User u = new User(); u.name

  • mybatis查询结果返回至实体类的示例代码

    近期,利用mybatis做一个简单查询,先看主要代码: Service层: package com.example1.service; import java.util.List; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.exampl

  • Java8通过Function获取字段名的方法(获取实体类的字段名称)

    看似很鸡肋其实在某些特殊场景还是比较有用的. 比如你将实体类转Map或者拿到一个Map结果的时候,你是怎么获取某个map的key和value. 方法一: 声明 String key1="aaa"; key为 key1,value 为map.get(key1); Map<String,Object> map=new HashMap<>(); map.put("aaa",1); //获取map的key 和value //key 为key1 Str

  • 深入浅出MyBatis中映射文件和实体类的关联性

    mybatis的映射文件写法多种多样,不同的写法和用法,在实际开发过程中所消耗的开发时间.维护时间有很大差别,今天我就把我认为比较简单的一种映射文件写法记录下来,供大家修改建议,争取找到一个最优写法~~: 以User对象和UserMap.xml为例讲解,代码如下: User为用户实体类(仅作为讲解,可以只关注引用类型变量,get/set方法省略): import com.google.common.collect.Lists; import com.gukeer.common.persisten

  • Mybatis-Plus实体类注解方法与mapper层和service层的CRUD方法

    目录 1 注解 1.1 @TableName 1.2 @TableId 1.3 @TableField 1.4 @TableLogic 2 mapper层的CRUD方法 2.1 增(insert) 2.2 删(delete) 2.3 改(update) 2.4 查(select) 3 service层的CRUD方法 3.1 批量添加或者更新 3.2 查询表中总记录数 1 注解 1.1 @TableName   之前在入门案例中我们分析过:使用mp底层方法生成的SQL语句中,表名为mapper或者

  • Mybatis之映射实体类中不区分大小写的解决

    目录 Mybatis 映射实体类中不区分大小写 解决办法 问题解决 Mybatis的一些小细节 问题一. #{}和${}的区别是什么? 问题二. 当实体类中的属性名和表中的字段名不一样,怎么办 问题三. 模糊查询like语句该怎么写 问题四. 通常一个Xml映射文件 问题五. Mybatis是如何将sql执行结果封装为目标对象并返回的 问题六. 如何获取自动生成的(主)键值 问题七. 在mapper中如何传递多个参数 问题八. Mybatis动态sql是做什么的 问题九. Mybatis的Xml

  • java反射遍历实体类属性和类型,并赋值和获取值的简单方法

    实例如下: import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Date; /** * 获取实体类型的属性名和类型 * @param model 为实体类 * @author kou 为传入参数 */ public class GetModelNameAndType { public

  • 如何使用IDEA的groovy脚本文件生成带JPA注解的实体类(图文详解)

    牛逼!IDEA不愧为神器,结合Groovy脚本,简直天下无敌,如今, 有许许多多的插件或者编辑器都支持根据数据表自动生成数据实体类了, 比如IDEA, 各种MyBatis的代码生成工具, 等等:本篇介绍一下如何使用IDEA的groovy脚本文件生成带JPA注解的实体类. # 使用IDEA连接数据库 注意 正式版IDEA才有此功能, 社区版木有 演示图片使用的IDEA版本为2018.3, 不同版本界面可能有细小差别 1.创建新的数据连接 如果没有, 可以上方菜单栏: 视图-工具窗口-Databas

  • java 利用反射机制,获取实体所有属性和方法,并对属性赋值

    一个普通的实体Person: private int id; private String name; private Date createdTime; ... //其它字段 // get set方法 ............... 现在需要把通过webService传过来的实体Person里面的所有字段的null值,换成"" 实现思路: 1.获取实体的所有字段,遍历 2.获取字段类型 3.调用字段的get方法,判断字段值是否为空 4.如果字段值为空,调用字段的set方法,为字段赋值

随机推荐