我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Mybatis-Plus主键生成策略的方法

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Mybatis-Plus主键生成策略的方法

前言

很多人在使用Mybatis-Plus的时候可能会疑惑,自己明明没有配置主键的生成策略,但是执行新增操作时却自动生成了主键,而且还特别长。这是由于Mybatis-Plus默认就会采用雪花算法填充主键字段。

今天就和大家详解聊聊Mybatis-Plus中主键生成的相关策略。

一、官网

Mybatis-Plus主键策略:https://baomidou.com/pages/e131bd/

Mybatis-Plus自定义ID生成器:https://baomidou.com/pages/568eb2/

TIP⚠️:
推荐学习框架的时候,多研究下官网,获取第一手资料。

二、主键注解@TableId说明

1、源码

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.ANNOTATION_TYPE})
public @interface TableId {
    String value() default "";

    IdType type() default IdType.NONE;
}

2、作用

标识主键字段
使用@TableId可以标识实体对象中和数据库表中主键对应的字段。如果不添加@TableId注解,会默认匹配id字段为主键。

变量名称和主键字段名称的匹配
如果表中的主键字段名称和实体中的主键字段名称不相同,这时候就要通过@TableId中的value属性明确指出对应的数据库主键字段的名称。

指定主键的生成方式
可以通过@TableId注解中的type属性指定主键的生成策略,具体支持哪些策略可以在IdType枚举中查看。

3、使用

@TableName(value ="user")
@Data
public class User implements Serializable {
    
    @TableId(value = "id",type = IdType.ASSIGN_ID)
    private Long userId;
    private String name;
    private Integer age;
    private String email;

三、主键生成策略-IdType枚举说明

通过查看IdType枚举类的源码,可以发现Mybatis-Plus中默认支持5种主键生成方式。

1、源码

public enum IdType {
    AUTO(0),
    NONE(1),
    INPUT(2),
    ASSIGN_ID(3),
    ASSIGN_UUID(4);

    private final int key;

    private IdType(int key) {
        this.key = key;
    }

    public int getKey() {
        return this.key;
    }
}

2、说明

描述
AUTO数据库 ID自增,这种情况下将表中主键设置为自增,否则,没有设置主动设置id值进行插入时会报错
NONE无状态,该类型为未设置主键类型(注解里等于跟随全局,全局里默认 ASSIGN_ID),注意这里官网文档有误
INPUTinsert 前自行 set 主键值,在采用IKeyGenerator类型的ID生成器时必须为INPUT
ASSIGN_ID分配 ID(主键类型为 Number(Long 和 Integer)或 String)(since 3.3.0),使用接口IdentifierGenerator的方法nextId(默认实现类为DefaultIdentifierGenerator雪花算法)
ASSIGN_UUID分配 UUID,主键类型为 String(since 3.3.0),使用接口IdentifierGenerator的方法nextUUID(默认 default 方法)

3、全局设置

IdType默认的全局设置为IdType.ASSIGN_ID,即由mybatis-plus主动分配主键,默认情况下由默认主键生成器实现类DefaultIdentifierGenerator采用雪花算法填充主键。

public DbConfig() {
    this.idType = IdType.ASSIGN_ID;
    this.tableUnderline = true;
    this.capitalMode = false;
    this.logicDeleteValue = "1";
    this.logicNotDeleteValue = "0";
    this.insertStrategy = FieldStrategy.NOT_NULL;
    this.updateStrategy = FieldStrategy.NOT_NULL;
    this.whereStrategy = FieldStrategy.NOT_NULL;
}

在spring boot中,可以通过如下配置更改全局配置。

mybatis-plus.global-config.db-config.id-type=assign_id

三、ID生成器介绍

Mybatis-Plus中的ID生成器主要分为2类,一类是IdentifierGenerator,另一类是IKeyGenerator

1、IdentifierGenerator

源码如下:

public interface IdentifierGenerator {
    //根据id是否为null判断是否需要主动分配Id
    default boolean assignId(Object idValue) {
        return StringUtils.checkValNull(idValue);
    }

    //生成数值型Id
    Number nextId(Object entity);

    //生成字符型uuid
    default String nextUUID(Object entity) {
        return IdWorker.get32UUID();
    }
}

说明:
IdentifierGenerator生成器中主要提供了3个方法。
其使用场景是:不依赖数据库生成ID,而是由mybatis-plus自己提供一套id生成算法。 对应的主键生成方式为IdType.ASSIGN_ID、ASSIGN_UUID

  • assignId 是否需要分配id
  • nextId 获取下一个数值型Id
  • nextUUID 获取下一个uuid

典型的实现是默认的id生成器DefaultIdentifierGenerator,基于雪花算法生成id。`

public class DefaultIdentifierGenerator implements IdentifierGenerator {
    private final Sequence sequence;

    public DefaultIdentifierGenerator() {
        this.sequence = new Sequence((InetAddress)null);
    }

    public DefaultIdentifierGenerator(InetAddress inetAddress) {
        this.sequence = new Sequence(inetAddress);
    }

    public DefaultIdentifierGenerator(long workerId, long dataCenterId) {
        this.sequence = new Sequence(workerId, dataCenterId);
    }

    public DefaultIdentifierGenerator(Sequence sequence) {
        this.sequence = sequence;
    }

    public Long nextId(Object entity) {
        return this.sequence.nextId();
    }
}

具体使用:

1、声明由mybatis-plus分配主键值

@TableName(value ="user")
@Data
public class User implements Serializable {
    
    @TableId(value = "id",type = IdType.ASSIGN_ID)
    private Long userId;
    private String name;
    private Integer age;
    private String email;

2、指定idGenerator的实现类

如果是默认的DefaultIdentifierGenerator,则不需要用户重新指定。

@Configuration
public class IdAutoConfig {
    @Value("${mybatis-plus.zookeeper.serverLists}")
    private String zkServerLists;

    @Bean
    public IdentifierGenerator idGenerator() {
        return new ImadcnIdentifierGenerator(zkServerLists);
    }
}

2、IKeyGenerator

源码如下:

public interface IKeyGenerator {
    //执行sql生成id
    String executeSql(String incrementerName);

    //获取数据库类型
    DbType dbType();
}

说明:
IKeyGenerator 生成器主要是根据不同的数据库类型,执行sql语句生成对应的主键。典型的数据库如Oracle,Postgre,需要根据序列器生成表主键。

相关实现类:

OracleKeyGenerator中的实现:
可以发现,是通过执行sql调用序列器生成的id。

public class OracleKeyGenerator implements IKeyGenerator {
    public OracleKeyGenerator() {
    }

    public String executeSql(String incrementerName) {
        return "SELECT " + incrementerName + ".NEXTVAL FROM DUAL";
    }

    public DbType dbType() {
        return DbType.ORACLE;
    }
}

具体使用:
1、在实体中通过@KeySequence指定序列器名称,并通过@TableId指定主键生成策略为IdType.INPUT

@KeySequence(value = "SEQ_ORACLE_STRING_KEY", clazz = String.class)
public class YourEntity {

    @TableId(value = "ID_STR", type = IdType.INPUT)
    private String idStr;

}

2、spring boot配置列中配置keyGenerator具体实现类

@Bean
public IKeyGenerator keyGenerator() {
    return new OracleKeyGenerator();
}

也可以通过配置项指定:

mybatis-plus.global-config.db-config.key-generators=com.baomidou.mybatisplus.extension.incrementer.OracleKeyGenerator

四、自定义主键生成器

自定义主键生成器也有2种方式。
如果需要通过执行sql语句来生成id的,可以通过实现IKeyGenerator接口来自定义。 如果不想依赖数据库,完全自定义一套主键生成策略,那么可以通过实现IdentifierGenerator接口来扩展。

下面演示如何通过实现IdentifierGenerator接口,自定义主键生成器。

1、自定义id生成器

@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;
    }
}

2、配置类中指定id生成器

@Bean
public IdentifierGenerator idGenerator() {
    return new CustomIdGenerator();
}

3、实体类中指定主键分配策略IdType.ASSIGN_ID

@TableName(value ="user")
@Data
public class User implements Serializable {
    
    @TableId(value = "id",type = IdType.ASSIGN_ID)
    private Long userId;
    private String name;
    private Integer age;
    private String email;

总结

本文主要是介绍了Mybatis-Plus主键生成策略及其相关的扩展方法。

1、详细介绍了@TableId注解的属性和作用,推荐项目中在实体的主键字段上明确添加@TableId注解,标识id字段以及id生成策略IdType。

2、目前mybatis-plus中有5种Id生成策略IdType,搞清楚各种的用法和使用场景。

  • AUTO 数据库 ID自增
  • NONE 未设置主键类型,也就是跟随全局策略,全局策略默认为ASSIGN_ID
  • INPUT insert 前自行 set 主键值
  • ASSIGN_ID 分配 ID
  • ASSIGN_UUID 分配 UUID

3、Mybatis-Plus中的ID生成器主要分为2类,一类是IdentifierGenerator,另一类是IKeyGenerator,搞清楚他们的区别和各自的使用场景。

IdentifierGenerator 适用于不依赖数据库,用户自定义的主键生成场景。

IKeyGenerator 依赖数据库,通过执行sql语句生成主键的场景。

到此这篇关于Mybatis-Plus主键生成策略的方法的文章就介绍到这了,更多相关Mybatis-Plus主键生成策略内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Mybatis-Plus主键生成策略的方法

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Mybatis-Plus主键生成策略的方法

本文主要介绍了Mybatis-Plus主键生成策略的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2022-11-13

mybatis-plus主键策略生成失败的解决

本文主要介绍了mybatis-plus主键策略生成失败的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-03-19

mybatis-plus主键策略生成失败如何解决

本篇内容介绍了“mybatis-plus主键策略生成失败如何解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!问题:主键生成失败,一直为0(
2023-07-05

MyBatis Plus主键设置策略是什么

这篇文章主要介绍了MyBatis Plus主键设置策略是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇MyBatis Plus主键设置策略是什么文章都会有所收获,下面我们一起来看看吧。根据一次插入失败报错来
2023-07-02

Mybatis-plus全局id生成策略是什么

这篇“Mybatis-plus全局id生成策略是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Mybatis-plus全
2023-06-26

mybatis-plus怎么使用雪花算法ID生成策略

本篇内容介绍了“mybatis-plus怎么使用雪花算法ID生成策略”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!mybatis-plus
2023-06-21

mybatis自动生成主键的方法是什么

MyBatis提供了多种自动生成主键的方法,以下是其中几种常用的方法:1. 使用数据库的自增主键:在数据库中将主键字段设置为自增类型,然后在MyBatis的映射文件中不需要显式指定主键的值,数据库会自动生成主键值。示例:```xmlINSE
2023-08-19

MyBatisPlus之id生成策略的方法

本文主要介绍了MyBatisPlus之id生成策略的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-03-19

MyBatis获取自动生成的(主)键值的方法

本文主要介绍了MyBatis获取自动生成的(主)键值的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-05-15

JPA 注解及主键生成策略使用指南

JPA 注解 Entity 常用注解 参考:JPA & Spring Data JPA学习与使用小记 指定对象与数据库字段映射时注解的位置:如@Id、@Column等注解指定Entity的字段与数据库字段对应关系时,注解的位置可以在Fiel
2023-08-16

Java探索之Hibernate主键生成策略详细介绍

1.increment 由Hibernate从数据库中去除主键的最大值(每个session只取一次),以该值为基础,每次增量为1,在内存中生成主键,不依赖于底层的数据库,因此可以跨数据库。2023-05-30

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录