MybatisPlus主键生成策略是什么(mybatisplus,开发技术)

时间:2024-05-03 10:27:07 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

      /ul></ul><h3>主键注解@TableId说明</h3

      1、源码

      @Documented
      @Retention(RetentionPolicy.RUNTIME)
      @Target({ElementType.FIELD,ElementType.ANNOTATION_TYPE})
      public@interfaceTableId{
      Stringvalue()default"";

      IdTypetype()defaultIdType.NONE;
      }

      MybatisPlus主键生成策略是什么/p><h4>2、作用</h4><p><strong>标识主键字段</strong><br/>使用@TableId可以标识实体对象中和数据库表中主键对应的字段。如果不添加@TableId注解,会默认匹配id字段为主键。</pp><strong>变量名称和主键字段名称的匹配</strong><br/>如果表中的主键字段名称和实体中的主键字段名称不相同,这时候就要通过@TableId中的value属性明确指出对应的数据库主键字段的名称。</pp><strong>指定主键的生成方式</strong><br/>可以通过@TableId注解中的type属性指定主键的生成策略,具体支持哪些策略可以在IdType枚举中查看。</p

      3、使用

      @TableName(value="user")
      @Data
      publicclassUserimplementsSerializable{
      /*
      主键ID
      */
      @TableId(value="id",type=IdType.ASSIGN_ID)
      privateLonguserId;
      privateStringname;
      privateIntegerage;
      privateStringemail;

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

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

      1、源码

      publicenumIdType{
      AUTO(0),
      NONE(1),
      INPUT(2),
      ASSIGN_ID(3),
      ASSIGN_UUID(4);

      privatefinalintkey;

      privateIdType(intkey){
      this.key=key;
      }

      publicintgetKey(){
      returnthis.key;
      }
      }

      2、说明

      值描述AUTO数据库 ID自增,这种情况下将表中主键设置为自增,否则,没有设置主动设置id值进行插入时会报错NONE无状态,该类型为未设置主键类型(注解里等于跟随全局,全局里默认 ASSIGN_ID),注意这里官网文档有误INPUTinsert 前自行 set 主键值,在采用IKeyGenerator类型的ID生成器时必须为INPUTASSIGN_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采用雪花算法填充主键。

      publicDbConfig(){
      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

      源码如下:

      publicinterfaceIdentifierGenerator{
      //根据id是否为null判断是否需要主动分配Id
      defaultbooleanassignId(ObjectidValue){
      returnStringUtils.checkValNull(idValue);
      }

      //生成数值型Id
      NumbernextId(Objectentity);

      //生成字符型uuid
      defaultStringnextUUID(Objectentity){
      returnIdWorker.get32UUID();
      }
      }

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

      • assignId 是否需要分配id

      • nextId 获取下一个数值型Id

      • nextUUID 获取下一个uuid

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

      publicclassDefaultIdentifierGeneratorimplementsIdentifierGenerator{
      privatefinalSequencesequence;

      publicDefaultIdentifierGenerator(){
      this.sequence=newSequence((InetAddress)null);
      }

      publicDefaultIdentifierGenerator(InetAddressinetAddress){
      this.sequence=newSequence(inetAddress);
      }

      publicDefaultIdentifierGenerator(longworkerId,longdataCenterId){
      this.sequence=newSequence(workerId,dataCenterId);
      }

      publicDefaultIdentifierGenerator(Sequencesequence){
      this.sequence=sequence;
      }

      publicLongnextId(Objectentity){
      returnthis.sequence.nextId();
      }
      }

      具体使用:

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

      @TableName(value="user")
      @Data
      publicclassUserimplementsSerializable{
      /*
      主键ID
      */
      @TableId(value="id",type=IdType.ASSIGN_ID)
      privateLonguserId;
      privateStringname;
      privateIntegerage;
      privateStringemail;

      2、指定idGenerator的实现类

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

      @Configuration
      publicclassIdAutoConfig{
      @Value("${mybatis-plus.zookeeper.serverLists}")
      privateStringzkServerLists;

      @Bean
      publicIdentifierGeneratoridGenerator(){
      returnnewImadcnIdentifierGenerator(zkServerLists);
      }
      }

      2、IKeyGenerator

      源码如下:

      publicinterfaceIKeyGenerator{
      //执行sql生成id
      StringexecuteSql(StringincrementerName);

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

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

      相关实现类:

      MybatisPlus主键生成策略是什么

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

      publicclassOracleKeyGeneratorimplementsIKeyGenerator{
      publicOracleKeyGenerator(){
      }

      publicStringexecuteSql(StringincrementerName){
      return"SELECT"+incrementerName+".NEXTVALFROMDUAL";
      }

      publicDbTypedbType(){
      returnDbType.ORACLE;
      }
      }/pre><p>具体使用:<br/>1、在实体中通过<code>@KeySequence</code指定序列器名称,并通过@TableId指定主键生成策略为IdType.INPUT

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

      @TableId(value="ID_STR",type=IdType.INPUT)
      privateStringidStr;

      }

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

      @Bean
      publicIKeyGeneratorkeyGenerator(){
      returnnewOracleKeyGenerator();
      }

      也可以通过配置项指定:

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

      自定义主键生成器

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

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

      1、自定义id生成器

      @Component
      publicclassCustomIdGeneratorimplementsIdentifierGenerator{
      @Override
      publicLongnextId(Objectentity){
      //可以将当前传入的class全类名来作为bizKey,或者提取参数来生成bizKey进行分布式Id调用生成.
      StringbizKey=entity.getClass().getName();
      //根据bizKey调用分布式ID生成
      longid=....;
      //返回生成的id值即可.
      returnid;
      }
      }

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

      @Bean
      publicIdentifierGeneratoridGenerator(){
      returnnewCustomIdGenerator();
      }

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

      @TableName(value="user")
      @Data
      publicclassUserimplementsSerializable{
      /*
      主键ID
      */
      @TableId(value="id",type=IdType.ASSIGN_ID)
      privateLonguserId;
      privateStringname;
      privateIntegerage;
      privateStringemail;

      本文:MybatisPlus主键生成策略是什么的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:怎么使用Composition API思想封装NProgress下一篇:

5 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18