MyBatis-plus如何设置主键策略和分页插件实现高效查询?
摘要:MyBatis-plus高级应用 主键策略 在MyBatis-plus中使用@TableId注解来设置主键生成策略。 在设置好自增策略后,在新增数据时,就不用给主键属性赋值了,数据库会自动生成主键的值。 auto策略 该策略为跟随数据库表的
MyBatis-plus高级应用
主键策略
在MyBatis-plus中使用@TableId注解来设置主键生成策略。
在设置好自增策略后,在新增数据时,就不用给主键属性赋值了,数据库会自动生成主键的值。
auto策略
该策略为跟随数据库表的主键策略,如果数据库表的主键设置为自增,那么主键策略就是自增。
public class User {
@TableId(type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
private String email;
}
input策略
该策略表示,必须由我们手动设置id,否则无法添加数据。那么我们在新增数据时,就必须给主键赋值了。
public class User {
@TableId(type = IdType.INPUT)
private Long id;
private String name;
private Integer age;
private String email;
}
ASSIGN_ID策略
当一个主键自增表的数据量很大时,需要对表进行拆分(水平分表或垂直分表),对于拆分后的数据,有三点需求:
之前表的主键有序,拆分后也要有序
虽然做了拆分,但每条数据还要保证主键唯一
主键不要直接暴露数据的数量,这样容易泄露关键信息
为了满足这三个需求,因此需要使用雪花算法。
雪花算法把一个 64 位的长整型数字(long 类型)拆分成不同 “段位”,分别存储时间戳、机器标识、序列号等信息,通过分段管理确保 ID 全局唯一,且因时间戳在前,ID 整体呈递增趋势。
雪花算法的核心结构(64 位分段):
位段
位数
作用
符号位
1 位
固定为 0(因为 ID 是正数,负数无意义)
时间戳位
41 位
存储相对时间戳(如相对于某个固定起始时间的毫秒数),可支持约 69 年的时间范围
机器 / 数据中心位
10 位
拆分(如 5 位数据中心 + 5 位机器 ID),最多支持 1024 个节点(2^10)
序列号位
12 位
同一毫秒内,同一机器生成的 ID 序号,支持每毫秒生成 4096 个 ID(2^12)
public class User {
// 主键生成策略是雪花算法
// 64位二进制最终转换为19位十进制,所以最后生成的id长度是19位
@TableId(type = IdType.ASSIGN_ID)
private Long id;
private String name;
private Integer age;
private String email;
}
NONE策略
NONE策略表示不指定主键生成策略,此时会跟随全局生成策略。当不指定策略时也会跟随全局策略。
那如何设置全局生成策略呢?
在springboot的配置文件中设置如下:
mybatis-plus:
global-config:
banner: false
db-config:
# 设置全局的主键生成策略。如果不指定,框架默认是assign_id策略
id-type: assign_id
ASSIGN_UUID策略
使用uuid作为主键的一种策略。
public class User {
@TableId(type = IdType.ASSIGN_UUID)
private String id;
private String name;
private Integer age;
private String email;
}
分页插件
分页的本质就是设置一个拦截器,通过拦截器拦截sql,通过在sql语句末尾添加limit关键字来实现分页效果。
具体配置步骤如下:
通过配置类指定一个具体数据库的分页插件,因为具体的数据库方言不同,分页语句也不同。
