一、ASSIGN_ID策略
1、设置生成策略为ASSIGN_ID
@Data @TableName("tbl_user") public class User { @TableId(type = IdType.ASSIGN_ID) private Long id; private String name; @TableField(value="pwd",select=false) private String password; private Integer age; private String tel; @TableField(exist=false) private Integer online; }
2、添加数据不设置ID
@SpringBootTest class Mybatisplus03DqlApplicationTests { @Autowired private UserDao userDao; @Test void testSave(){ User user = new User(); user.setName("夏志121"); user.setPassword("xiazhi121"); user.setAge(12); user.setTel("40232493522"); userDao.insert(user); } }
注意:这种生成策略,不需要手动设置ID,如果手动设置ID,则会使用自己设置的值
3、运行新增方法
生成的ID是一个Long类型的数据
二、ASSIGN_UUID策略
1、设置生成策略为ASSIGN_UUID
使用uuid需要注意是,主键的类型不能是Long,而应该改为String类型
@Data @TableName("tbl_user") public class User { @TableId(type = IdType.ASSIGN_UUID) private String id; private String name; @TableField(value="pwd",select=false) private String password; private Integer age; private String tel; @TableField(exist=false) private Integer online; }
2、修改表的主键类型
主键类型设置为varchar,长度要大于32,因为UUID生成的主键为32位,如果长度小的话就会导致插入失败
3、添加数据不设置ID
@SpringBootTest class Mybatisplus03DqlApplicationTests { @Autowired private UserDao userDao; @Test void testSave(){ User user = new User(); user.setName("夏志121"); user.setPassword("xiazhi121"); user.setAge(19); user.setTel("412412534343"); userDao.insert(user); } }
4、运行新增方法
添加的id是雪花算法得出来的
三、雪花算法
雪花算法(SnowFlake),是Twitter官方给出的算法实现 是用Scala写的。其生成的结果是一个
64bit大小整数,它的结构如下图:
● 1bit,不用,因为二进制中最高位是符号位,1表示负数,0表示正数。生成的id一般都是用整数,所以最高位固定为0。
● 41bit-时间戳,用来记录时间戳,毫秒级
● 10bit-工作机器id,用来记录工作机器id,其中高位5bit是数据中心ID其取值范围0-31,低位5bit是工作节点ID其取值范围0-31,两个组合起来最多可以容纳1024个节点
● 序列号占用12bit,每个节点每毫秒0开始不断累加,最多可以累加到4095,一共可以产生4096个ID
四、ID生成策略对比及简化配置
ID生成策略对比
● NONE: 不设置id生成策略,MP不自动生成,约等于INPUT,所以这两种方式都需要用户手动设置,但是手动设置第一个问题是容易出现相同的ID造成主键冲突,为了保证主键不冲突就需要做很多判定,实现起来比较复杂
● AUTO:数据库ID自增,这种策略适合在数据库服务器只有1台的情况下使用,不可作为分布式ID使用
● ASSIGN_UUID:可以在分布式的情况下使用,而且能够保证唯一,但是生成的主键是32位的字符串,长度过长占用空间而且还不能排序,查询性能也慢
● ASSIGN_ID:可以在分布式的情况下使用,生成的是Long类型的数字,可以排序性能也高,但是生成的策略和服务器时间有关,如果修改了系统时间就有可能导致出现重复主键
● 综上所述,每一种主键策略都有自己的优缺点,根据自己项目业务的实际情况来选择使用才是最明智的选择。
简化配置
模型类主键策略配置
如果要在项目中的每一个模型类上都需要使用相同的生成策略,稍微比较繁琐,我们可以在配置文件中添加内容来使用统一的配置:
mybatis-plus: global-config: db-config: id-type: assign_id
配置完成之后,每个模型的注解ID策略都将成为assign_id
数据库表与模型关系的映射关系
MP会默认将模型类的类名首字母小写作为表名使用,假如数据库名称都以tbl_开头,那么我们就需要将所有的模型类上添加@TableName,配置起来还是比较繁琐,简化方式可以在配置文件中配置如下内容:
mybatis-plus: global-config: db-config: table-prefix: tbl_
设置前缀的内容,这样MP就会拿tbl_加上模型类的首字母小写,就刚好组装成数据库的表名。