【MyBatis-Plus】(2)主键生成策略

【MyBatis-Plus】(2)主键生成策略

前言

该片文章紧接着上一篇文章。现在实现一个插入,并且扩展一下不同的主键生成策略。

一、主键生成策略

1.测试插入

新建一个测试方法,用于测试插入。

这里我们并没有给用户输入id(主键)。

    @Test
    public void testInsert() {
        User user = new User();
        user.setName("张三");
        user.setAge(20);
        user.setEmail("123456@qq.com");

        int insert = userMapper.insert(user);
        System.out.println(user);
    }

输出:

我们可以看到,我们并没有给他指定id,但是mybatis-plus给我们默认生成了一个id。

User(id=1253591398346522625, name=张三, age=20, email=123456@qq.com)

2.探究生成的id

id的生成有好几种方式。我们最常用的时数据自增长序列或字段。推荐阅读这篇文章:分布式系统唯一ID生成方案汇总

  1. 数据库自增长序列或字段
  2. UUID
  3. Redis生成ID
  4. Twitter的snowflake算法(雪花算法)
  5. 利用zookeeper生成唯一ID

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

上面插入语句中的id,使用的就是“雪花算法”(mybatis-plus默认使用这个)。

二、自定义主键id生成策略

注意:先去上一篇文章创建的user表中,将id字段设为自增。否则会报如下异常:“Field 'id' doesn't have a default value”。

修改实体类:在id字段上,增加一个注解@TableId(type = IdType.AUTO)(该注解代表id生成策略为自增)。更多的主键生成策略参考:主键注解 @TableId

@Data
public class User {
    @TableId(type = IdType.AUTO)
    private Long id;
    private String name;
    private Integer age;
    private String email;
}

重新运行刚刚创建的插入测试类:

    @Test
    public void testInsert() {
        User user = new User();
        user.setName("张三");
        user.setAge(20);
        user.setEmail("123456@qq.com");

        int insert = userMapper.insert(user);
        System.out.println(user);
    }

然后查询user表中所有数据:

    @Test
    public void testSelect() {
        List<User> userList = userMapper.selectList(null);
        userList.forEach(System.out::println);
    }

输出:
可以看出在,第一次运行插入时,id使用的是“雪花算法”,id值为“1253591398346522625”。第二次我修改的id的生成策略,修改为自增,此时id值由上一次自增,插入的数据id为“1253591398346522626”。

User(id=1253591398346522625, name=张三, age=20, email=123456@qq.com)
User(id=1253591398346522626, name=张三, age=20, email=123456@qq.com)

备注:还可以使用别的主键生成策略,详情看官方文档 IdType