前言
该片文章紧接着上一篇文章。现在实现一个插入,并且扩展一下不同的主键生成策略。
一、主键生成策略
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生成方案汇总
- 数据库自增长序列或字段
- UUID
- Redis生成ID
- Twitter的snowflake算法(雪花算法)
- 利用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。