主键策略
# 新增数据
@Test
public void testAddUser(){
User user = new User();
user.setName("stt");
user.setAge(22);
user.setEmail("work_stt@163.com");
int count = userMapper.insert(user);
// 返回创建成功的条数
System.out.println(count);
}
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
- 注意观察数据库记录,发现id是一串数字
- MybatisPlus默认使用雪花算法计算id
# 主键生成策略
- 进入@TableId注解的IdType枚举类,可以看到如下生成策略
public enum IdType {
AUTO(0),
NONE(1),
INPUT(2),
ASSIGN_ID(3),
ASSIGN_UUID(4),
/** @deprecated */
@Deprecated
ID_WORKER(3),
/** @deprecated */
@Deprecated
ID_WORKER_STR(3),
/** @deprecated */
@Deprecated
UUID(4);
...
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
- 默认系统使用的是ASSIGN_ID
# ASSIGN_ID
- 使用雪花算法生成id
@TableId(type = IdType.ASSIGN_ID)
private Long id;
1
2
2
# 雪花算法
分布式ID生成器
由Twitter公布的分布式主键生成算法
长度共64bit,long类型
保证不同表的主键的不重复性,相同表的主键的有序性(有序性提升数据库查询效率)
优点:整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞,并且效率较高
- 符号位,1bit
- 由于long基本类型在Java中是带符号的,最高位是符号位,正数是0,负数是1,所以id一般是正数,最高位是0
- 时间位,41bit
- 毫秒级
- 存储时间截的差值(当前时间截 - 开始时间截),结果约等于69.73年
- 工作进程位,10bit
- 机器的ID
- 数据中心,5bit
- 机器ID,5bit
- 可部署1024个节点
- 机器的ID
- 流水号,12bit
- 每个节点在每毫秒可以产生 4096 个 ID
# ATUO
- 自增策略
- 需要在创建数据表的时候设置主键自增
@TableId(type = IdType.AUTO)
private Long id;
1
2
2
- 如果要所有id都是自增设置,可以统一在application.properties中设置
#全局设置主键生成策略
mybatis-plus.global-config.db-config.id-type=auto
1
2
2
Last Updated: 2022/01/16, 11:29:51