MybatisPlus主键生成策略是什么
导读:本文共5440.5字符,通常情况下阅读需要18分钟。同时您也可以点击右侧朗读,来听本文内容。按键盘←(左) →(右) 方向键可以翻页。
摘要:/ul></ul><h3>主键注解@TableId说明</h31、源码@Documented@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.FIELD,ElementType.ANNOTATION_TYPE})public@interfaceTableId{Stringvalue()defa... ...
目录
(为您整理了一些要点),点击可以直达。@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD,ElementType.ANNOTATION_TYPE})
public@interfaceTableId{
Stringvalue()default"";IdTypetype()defaultIdType.NONE;
}
/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、说明
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
。
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
是否需要分配idnextId
获取下一个数值型IdnextUUID
获取下一个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,需要根据序列器生成表主键。
相关实现类:
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主键生成策略是什么的详细内容,希望对您有所帮助,信息来源于网络。