温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

MybatisPlus主键生成策略是什么

发布时间:2022-08-11 11:35:33 来源:亿速云 阅读:485 作者:iii 栏目:开发技术

这篇文章主要讲解了“MybatisPlus主键生成策略是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MybatisPlus主键生成策略是什么”吧!

    主键注解@TableId说明

    1、源码

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

    MybatisPlus主键生成策略是什么

    2、作用

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

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

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

    3、使用

    @TableName(value ="user")
    @Data
    public class User implements Serializable {
        /**
         * 主键ID
         */
        @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

    MybatisPlus主键生成策略是什么

    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 {
        /**
         * 主键ID
         */
        @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,需要根据序列器生成表主键。

    相关实现类:

    MybatisPlus主键生成策略是什么

    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 {
        /**
         * 主键ID
         */
        @TableId(value = "id",type = IdType.ASSIGN_ID)
        private Long userId;
        private String name;
        private Integer age;
        private String email;

    感谢各位的阅读,以上就是“MybatisPlus主键生成策略是什么”的内容了,经过本文的学习后,相信大家对MybatisPlus主键生成策略是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

    向AI问一下细节

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

    AI