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 的字符串表示法
其它策略这里就不再测试了