自定义主键key生成策略
场景分析
在日常开发中我们对于保存数据库中的一条记录往往采用uuid形式,但在某些特定场景我们需要根据自定义id作为数据主键,该怎么办?MP给了一个很好的解决方案。
1.代码实现
我们可以实现MP中的IKeyGenerator决口用于自定义主键
package com.zhan.springboot.config;
import com.baomidou.mybatisplus.core.incrementer.IKeyGenerator;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
@Component
public class CustomerKeyGenerator implements IKeyGenerator {
/**
*
* @param incrementerName 增量器名称,@KeySequence中的value之会传入该参数中
* @return
*/
@Override
public String executeSql(String incrementerName) {
//todo 自定义id代码编写位置
String id = getId();
String customId = "20210915-" + "十四运开幕式";
return "select " + "'" + customId + "'" + "from dual";
}
public static String getId() {
//获取当前时间戳
String str = String.valueOf(System.currentTimeMillis());
List list = new ArrayList();
//将时间戳放入到List中
for (Character s : str.toCharArray()) {
list.add(s.toString());
}
//随机打乱
Collections.shuffle(list);
//拼接字符串,并添加2(自定义)位随机数
return String.join("", list) + randomNumber(2);
}
/**
* 生成指定长度的一个数字字符串
*
* @param num
* @return
*/
public static String randomNumber(int num) {
if (num < 1) {
num = 1;
}
Random random = new Random();
StringBuilder str = new StringBuilder();
for (int i = 0; i < num; i++) {
str.append(random.nextInt(10));
}
return str.toString();
}
}
2.在实体类上的操作步骤
我们在实体类上使用@KeySequence(value = "customerKeyGenerator"),其中value是我们自定义实现类bean的id
package com.zhan.springboot.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
@TableName("tbl_user")
@KeySequence(value = "customerKeyGenerator")
public class User {
@TableId(value = "id",type = IdType.INPUT)
private String id;
private String name;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
测试图如下:
3.在主键字段id上使用@TableId(value = "id",type = IdType.INPUT),其中type = IdType.INPUT表示用户自定义输入类型,该类型可以通过自己注册自动填充插件进行填充。
至此就完成了对MySQL数据库数据自定义主键操作,其实MP还为我们提供了中队的主键策略,这个在官网上可以看见,如下
TIP
主键生成策略必须使用INPUT
支持父类定义@KeySequence子类继承使用
支持主键类型指定(3.3.0开始自动识别主键类型)
内置支持:
DB2KeyGenerator
H2KeyGenerator
KingbaseKeyGenerator
OracleKeyGenerator
PostgreKeyGenerator
如果内置支持不满足你的需求,可实现IKeyGenerator接口来进行扩展