目标:
了解 Mybatis-Plus 它的主键生成算法
学习步骤:
1、何为❄雪花算法
2、实现雪花ID自增
3、了解MyBatis-Plus 的主键生成策略 ⇒ IdType 枚举类
一、❄雪花算法是什么?
一个long
类型的Java 长整型数字
核心思想:使用
41 bit
作为 毫秒数,10 bit
作为机器 ID(5个bit是数据中心,5个bit是机器ID),12 bit
作为 毫秒内的流水号(意味着每个节点在每毫秒可以产生4096个ID),最后还有一个符号位,永远是0,几乎可以保证全球唯一 !
二、代码测试一波
此处接的是上一篇 MyBatis-Plus
博文的数据库和代码
@Test
void testInsert(){
User user = new User();
user.setName("CSNZ");
user.setAge(21);
int res = userMapper.insert(user);
System.out.println(res);
}
实体类字段上加上 @TableId(type = IdType.ID_WORKER)
插入成功,查看数据库数据
此时这个 id 就是雪花ID ❄
再执行一次呢?
确实是不同的,但此时id却不是自增的,如果我们想要他自增呢?如何实现?
尝试数据库中设置id主键自增
,再插入试试
发现不得行啊!
得在实体类字段上加上 @TableId(type = IdType.AUTO)
IdType
的属性值默认为 AUTO
现在有了这两个 前提条件下 再插入数据试试
成功了!
实现雪花id
实体类字段需 加上 @TableId(type = IdType.ID_WORKER)
如果想实现主键自增
1、实体类字段需 加上 @TableId(type = IdType.AUTO)
2、数据库字段一定要是自增的!
三、那么到这里肯定就有疑惑了,这个TableId
究竟是啥玩意儿~
可以看到这是一个注解,有value
属性和 type
属性,并且type
属性的默认值为 NONE
进一步可以看到
IdType
又是一个枚举类
MyBatis-Plus 的主键生成策略 就是取决于这些枚举变量!
mybatis-plus3.3.0之后,共有五种主键生成策略
public enum IdType {
/**
* 数据库ID自增,数据库需要支持主键自增(如MySQL),并设置主键自增
*/
AUTO(0),
/**
* 该类型为未设置主键类型,默认使用雪花算法生成
*/
NONE(1),
/**
* 用户输入ID,数据类型和数据库保持一致就行
* <p>该类型可以通过自己注册自动填充插件进行填充</p>
*/
INPUT(2),
/* 以下3种类型、只有当插入对象ID 为空,才自动填充。 */
/**
* 全局唯一ID (idWorker),数值类型 数据库中也必须是数值类型 否则会报错
*/
ID_WORKER(3),
/**
* 全局唯一ID (UUID,不含中划线)
*/
UUID(4),
/**
* 字符串全局唯一ID (idWorker 的字符串表示),数据库也要保证一样字符类型
*/
ID_WORKER_STR(5);
}