Mybatis Plus自定义主键生成策略
Mybatis Plus自定义主键生成策略
前景提要
Mybatis Pro的主键策略定义
public enum IdType {
AUTO(0), //数据库自增 依赖数据库
NONE(1), // 表示该类型未甚至主键类型 (如果没有主键策略)默认根据雪花算法生成
INPUT(2), //用户输入ID(该类型可以通过自己注册填充插件进行填充)
ASSIGN_ID(3),
//雪花算法(SnowFlake)是 Twitter 开源的分布式 id 生成算法。其核心思想就是:使用一个 64 bit 的 long 型的数字作为全局唯一 id。在分布式系统中的应用十分广泛,且 ID 引入了时间戳,基本上保持自增的
ASSIGN_UUID(4), //不含中划线的UUID
/** @deprecated */
@Deprecated
ID_WORKER(3), //全局唯一(idWorker)数值类型
/** @deprecated */
@Deprecated
ID_WORKER_STR(3), //全局唯一(idWorker的字符串表示)
/** @deprecated */
@Deprecated
UUID(4); //全局唯一(UUID)
private final int key;
private IdType(int key) {
this.key = key;
}
public int getKey() {
return this.key;
}
}
Mybatis plus主键生成策略方法
方法 | 主键生成策略 | 主键类型 | 说明 |
---|---|---|---|
nextId | ASSIGN_ID, |
Long,Integer,String | 支持自动转换为String类型,但数值类型不支持自动转换,需精准匹配,例如返回Long,实体主键就不支持定义为Integer |
nextUUID | ASSIGN_UUID, |
String | 默认不含中划线的UUID生成 |
官网的指导文件提供了三种配置方式:
Spring-Boot
#方式一:声明为Bean供Spring扫描注入
@Component
public class CustomIdGenerator implements IdentifierGenerator {
@Override
public Long nextId(Object entity) {
//可以将当前传入的class全类名来作为bizKey,或者提取参数来生成bizKey进行分布式Id调用生成.
String bizKey = entity.getClass().getName();
//根据bizKey调用分布式ID生成
long id = ....;
//返回生成的id值即可.
return id;
}
}
#方式二:使用配置类
@Bean
public IdentifierGenerator idGenerator() {
return new CustomIdGenerator();
}
#方式三:通过MybatisPlusPropertiesCustomizer自定义
@Bean
public MybatisPlusPropertiesCustomizer plusPropertiesCustomizer() {
return plusProperties -> plusProperties.getGlobalConfig().setIdentifierGenerator(new CustomIdGenerator());
}
需求:生成String类型的ID
数据库 ID 字段: vachar(18) user_id
实体类注解配置:
@TableId(value = "user_id", type = IdType.ASSIGN_UUID)
private String userId;
主键生成策略采用第二种方式(配置类)配置:
/**
* 自定义ID生成策略
* @return
*/
@Bean
public IdentifierGenerator getIdentifierGenerator(){
return new IdentifierGenerator() {
@Override
public Number nextId(Object entity) {
return null;
}
@Override
public String nextUUID(Object entity) {
return IDuitl.getCustomId();
}
};
// getCustomId方法
private String getCustomId(){
String time = String.valueOf(System.currentTimeMillis());
return "LAN" + time;
}
}
End.
Mybatis Plus自定义主键生成策略
本博客所有文章除特别声明外,均采用
CC BY-NC-SA 4.0
许可协议。转载请注明来自 Hi I'm LouisLan!
评论
0 评论