MyBatisPlus 您所在的位置:网站首页 雪花算法和uuid MyBatisPlus

MyBatisPlus

2023-03-13 11:34| 来源: 网络整理| 查看: 265

目录

一、ASSIGN_ID策略

二、ASSIGN_UUID策略

三、雪花算法

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

ID生成策略对比

简化配置

模型类主键策略配置

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

一、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大小整数,它的结构如下图:

● 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_加上模型类的首字母小写,就刚好组装成数据库的表名。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有