MyBatisPlus-ASSIGN_ID、ASSIGN_UUID策略、雪花算法及简化配置

简介: MyBatisPlus-ASSIGN_ID、ASSIGN_UUID策略、雪花算法及简化配置

一、ASSIGN_ID策略

1、设置生成策略为ASSIGN_ID

@Data 
@TableName("tbl_user") 
public class User { 
    @TableId(type = IdType.ASSIGN_ID) 
    private Long id; 
    private String name; 
    @TableField(value="pwd",select=false) 
    private String password; 
    private Integer age; 
    private String tel; 
    @TableField(exist=false) 
    private Integer online; 
}

2、添加数据不设置ID

@SpringBootTest 
class Mybatisplus03DqlApplicationTests { 
    @Autowired 
    private UserDao userDao; 
    @Test 
    void testSave(){ 
        User user = new User(); 
        user.setName("夏志121"); 
        user.setPassword("xiazhi121"); 
        user.setAge(12); user.setTel("40232493522"); 
        userDao.insert(user); 
    } 
}

注意:这种生成策略,不需要手动设置ID,如果手动设置ID,则会使用自己设置的值


3、运行新增方法


生成的ID是一个Long类型的数据

二、ASSIGN_UUID策略

1、设置生成策略为ASSIGN_UUID


使用uuid需要注意是,主键的类型不能是Long,而应该改为String类型

@Data 
@TableName("tbl_user") 
public class User { 
    @TableId(type = IdType.ASSIGN_UUID)
    private String id; 
    private String name; 
    @TableField(value="pwd",select=false) 
    private String password; 
    private Integer age; 
    private String tel; 
    @TableField(exist=false) 
    private Integer online; 
}

2、修改表的主键类型


主键类型设置为varchar,长度要大于32,因为UUID生成的主键为32位,如果长度小的话就会导致插入失败


3、添加数据不设置ID

@SpringBootTest 
class Mybatisplus03DqlApplicationTests { 
    @Autowired 
    private UserDao userDao; 
    @Test 
    void testSave(){ 
        User user = new User(); 
        user.setName("夏志121"); 
        user.setPassword("xiazhi121"); 
        user.setAge(19); 
        user.setTel("412412534343"); 
        userDao.insert(user); 
    } 
}

4、运行新增方法


添加的id是雪花算法得出来的

三、雪花算法

雪花算法(SnowFlake),是Twitter官方给出的算法实现 是用Scala写的。其生成的结果是一个


64bit大小整数,它的结构如下图:

5e341b792c5544259bfa92f9574b8215.png

● 1bit,不用,因为二进制中最高位是符号位,1表示负数,0表示正数。生成的id一般都是用整数,所以最高位固定为0。

● 41bit-时间戳,用来记录时间戳,毫秒级

● 10bit-工作机器id,用来记录工作机器id,其中高位5bit是数据中心ID其取值范围0-31,低位5bit是工作节点ID其取值范围0-31,两个组合起来最多可以容纳1024个节点

● 序列号占用12bit,每个节点每毫秒0开始不断累加,最多可以累加到4095,一共可以产生4096个ID

四、ID生成策略对比及简化配置

ID生成策略对比

● NONE: 不设置id生成策略,MP不自动生成,约等于INPUT,所以这两种方式都需要用户手动设置,但是手动设置第一个问题是容易出现相同的ID造成主键冲突,为了保证主键不冲突就需要做很多判定,实现起来比较复杂

● AUTO:数据库ID自增,这种策略适合在数据库服务器只有1台的情况下使用,不可作为分布式ID使用

● ASSIGN_UUID:可以在分布式的情况下使用,而且能够保证唯一,但是生成的主键是32位的字符串,长度过长占用空间而且还不能排序,查询性能也慢

● ASSIGN_ID:可以在分布式的情况下使用,生成的是Long类型的数字,可以排序性能也高,但是生成的策略和服务器时间有关,如果修改了系统时间就有可能导致出现重复主键

● 综上所述,每一种主键策略都有自己的优缺点,根据自己项目业务的实际情况来选择使用才是最明智的选择。

简化配置

模型类主键策略配置

如果要在项目中的每一个模型类上都需要使用相同的生成策略,稍微比较繁琐,我们可以在配置文件中添加内容来使用统一的配置:

mybatis-plus: 
    global-config: 
        db-config:
            id-type: assign_id

配置完成之后,每个模型的注解ID策略都将成为assign_id

数据库表与模型关系的映射关系

MP会默认将模型类的类名首字母小写作为表名使用,假如数据库名称都以tbl_开头,那么我们就需要将所有的模型类上添加@TableName,配置起来还是比较繁琐,简化方式可以在配置文件中配置如下内容:

mybatis-plus: 
    global-config: 
        db-config: 
            table-prefix: tbl_

设置前缀的内容,这样MP就会拿tbl_加上模型类的首字母小写,就刚好组装成数据库的表名。

目录
相关文章
|
1月前
|
人工智能 自然语言处理 算法
当prompt策略遇上分治算法,南加大、微软让大模型炼成“火眼金睛”
【2月更文挑战第24天】当prompt策略遇上分治算法,南加大、微软让大模型炼成“火眼金睛”
24 2
当prompt策略遇上分治算法,南加大、微软让大模型炼成“火眼金睛”
|
1月前
|
算法 Java
雪花算法生成id
雪花算法生成id
|
2月前
|
存储 算法 数据库
C++ “雪花算法“原理
C++ “雪花算法“原理
|
10天前
|
并行计算 搜索推荐 算法
NumPy排序算法与性能优化策略
【4月更文挑战第17天】NumPy是Python科学计算的核心库,提供高效数组操作,包括排序算法:`numpy.sort()`(返回排序数组)、`numpy.argsort()`(返回排序索引)和`numpy.lexsort()`(多键排序)。为了优化性能,可选择合适排序算法、避免重复排序、利用并行计算、预处理数据及使用高级数据结构。了解这些策略能提升大规模数据集处理的效率。
|
28天前
|
缓存 算法 关系型数据库
深度思考:雪花算法snowflake分布式id生成原理详解
雪花算法snowflake是一种优秀的分布式ID生成方案,其优点突出:它能生成全局唯一且递增的ID,确保了数据的一致性和准确性;同时,该算法灵活性强,可自定义各部分bit位,满足不同业务场景的需求;此外,雪花算法生成ID的速度快,效率高,能有效应对高并发场景,是分布式系统中不可或缺的组件。
深度思考:雪花算法snowflake分布式id生成原理详解
|
1月前
|
算法 数据库 索引
什么是雪花算法?啥原理?
什么是雪花算法?啥原理?
34 0
什么是雪花算法?啥原理?
|
1月前
|
算法 Java 数据中心
分布式ID生成系统之雪花算法详解
在当今的云计算和微服务架构盛行的时代,分布式系统已成为软件开发的重要组成部分。随着系统规模的扩大和业务的复杂化,对数据一致性和唯一性的要求也越来越高,尤其是在全局唯一标识符(ID)的生成上。因此,分布式ID生成系统应运而生,成为保证数据唯一性和提高系统可扩展性的关键技术之一。雪花算法(Snowflake)是Twitter开源的一种算法,用于生成64位的全局唯一ID,非常适用于分布式系统中生成唯一标识符。下面我们将深入探讨雪花算法的原理、结构和实现方式。
98 2
 分布式ID生成系统之雪花算法详解
|
2月前
|
算法
雪花算法id生成util
雪花算法id生成util
17 0
|
2月前
|
缓存 算法 Java
Shiro【散列算法、Shiro会话、退出登录 、权限表设计、注解配置鉴权 】(五)-全面详解(学习总结---从入门到深化)
Shiro【散列算法、Shiro会话、退出登录 、权限表设计、注解配置鉴权 】(五)-全面详解(学习总结---从入门到深化)
46 0
Shiro【散列算法、Shiro会话、退出登录 、权限表设计、注解配置鉴权 】(五)-全面详解(学习总结---从入门到深化)
|
3月前
|
负载均衡 算法 应用服务中间件
Nginx的Fair算法:配置与原理
Nginx的Fair算法:配置与原理
54 0