MyBtais-Plus 自定义主键key生成策略

自定义主键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;
    }
}

测试图如下:


image.png

image.png

image.png
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接口来进行扩展

你可能感兴趣的:(MyBtais-Plus 自定义主键key生成策略)