mybatisPlus-主键生成策略

承接:mybatisPlus-插入测试

分布式系统唯一ID生成方案汇总:分布式系统唯一ID生成方案汇总

1 雪花算法

snowflake是Twitter开源的分布式ID生成算法,结果是一个long型的ID。其核心思想是:使用41bit作为毫秒数,10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID),12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生 4096 个 ID),最后还有一个符号位,永远是0。可以保证几乎全球唯一!

2 主键自增测试

在User实体类字段上 加 @TableId(type = IdType.AUTO)注解

src/main/java/com/lv/mybatis_plus/pojo/User.java

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    //对应数据库的主键(uuid,自增id,雪花算法,redis,zookeeper!)
    @TableId(type = IdType.AUTO)
    private Long id;
    private String name;
    private Integer age;
    private String email;
}

修改数据库id字段一定要自动递增

再次运行测试类中的插入方法,然后查看数据库新增字段

id字段实现了自增

3 手动输入主键测试

修改User实体类的 @TableId(type = IdType.INPUT)注解

src/main/java/com/lv/mybatis_plus/pojo/User.java

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    //对应数据库的主键(uuid,自增id,雪花算法,redis,zookeeper!)
    @TableId(type = IdType.INPUT) //一旦手动输入id之后,就需要自己写id了
    private Long id;
    private String name;
    private Integer age;
    private String email;
}

此时运行插入测试方法,查看控制台日志

可以看出id为null,我们没有给id传值,此时查看一下数据库

因为我们给数据库中的主键设置自动递增了,所有数据还是插入进去了,那么接下来我们修改一个测试类,给id传入一个值再测试一次

src/test/java/com/lv/mybatis_plus/MybatisPlusApplicationTests.java

//测试插入
@Test
public void testInsert(){
    User user = new User();
    user.setId(9527L);//传入一个Long类型的id
    user.setName("星露谷");
    user.setAge(8);
    user.setEmail("1148397597@qq.com");
    int result = userMapper.insert(user); // mybatis-plus会帮我们自动生成id
    System.out.println(result); //受影响的行数
    System.out.println(user); //发现,id会自动回填
}

运行插入方法,查看控制台和数据库

数据插入成功

4 所有主键生成策略

只需要修改实体类上@TableId(type = ???)注解 中的type值即可,默认 ID_WORKER 全局唯一的id

    AUTO(0), //数据库id自增
    NONE(1), //未设置主键
    INPUT(2), //手动输入
    ID_WORKER(3), //默认的全局唯一id
    UUID(4), //全局唯一uuid
    ID_WORKER_STR(5); //ID_WORKER 的字符串表示法

 其它策略这里就不再测试了

posted @ 2022-03-29 15:37  从0开始丿  阅读(765)  评论(0编辑  收藏  举报