Teng's blog Teng's blog
首页
Java
H5前端
GitHub (opens new window)
首页
Java
H5前端
GitHub (opens new window)
  • 初步使用
  • 主键策略
    • 新增数据
    • 主键生成策略
      • ASSIGN_ID
      • ATUO
  • 自动填充
  • 乐观锁
  • 基本查询
  • 删除操作
  • 使用 Wrapper 查询
  • Framework-MybatisPlus
Shetengteng
2021-11-24

主键策略

# 新增数据

@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
  • 注意观察数据库记录,发现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
  • 默认系统使用的是ASSIGN_ID

# ASSIGN_ID

  • 使用雪花算法生成id
@TableId(type = IdType.ASSIGN_ID)
private Long id;
1
2

# 雪花算法

  • 分布式ID生成器

  • 由Twitter公布的分布式主键生成算法

  • 长度共64bit,long类型

  • 保证不同表的主键的不重复性,相同表的主键的有序性(有序性提升数据库查询效率)

  • 优点:整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞,并且效率较高

  • 符号位,1bit
    • 由于long基本类型在Java中是带符号的,最高位是符号位,正数是0,负数是1,所以id一般是正数,最高位是0
  • 时间位,41bit
    • 毫秒级
    • 存储时间截的差值(当前时间截 - 开始时间截),结果约等于69.73年
  • 工作进程位,10bit
    • 机器的ID
      • 数据中心,5bit
      • 机器ID,5bit
      • 可部署1024个节点
  • 流水号,12bit
    • 每个节点在每毫秒可以产生 4096 个 ID

# ATUO

  • 自增策略
  • 需要在创建数据表的时候设置主键自增
@TableId(type = IdType.AUTO)
private Long id;
1
2
  • 如果要所有id都是自增设置,可以统一在application.properties中设置
#全局设置主键生成策略
mybatis-plus.global-config.db-config.id-type=auto
1
2
Last Updated: 2022/01/16, 11:29:51
初步使用
自动填充

← 初步使用 自动填充→

Theme by Vdoing | Copyright © 2021-2022 Shetengteng | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式