您好,登錄后才能下訂單哦!
這篇文章主要講解了“MybatisPlus主鍵生成策略是什么”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“MybatisPlus主鍵生成策略是什么”吧!
@Documented @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD, ElementType.ANNOTATION_TYPE}) public @interface TableId { String value() default ""; IdType type() default IdType.NONE; }
標識主鍵字段
使用@TableId可以標識實體對象中和數據庫表中主鍵對應的字段。如果不添加@TableId注解,會默認匹配id字段為主鍵。
變量名稱和主鍵字段名稱的匹配
如果表中的主鍵字段名稱和實體中的主鍵字段名稱不相同,這時候就要通過@TableId中的value屬性明確指出對應的數據庫主鍵字段的名稱。
指定主鍵的生成方式
可以通過@TableId注解中的type屬性指定主鍵的生成策略,具體支持哪些策略可以在IdType枚舉中查看。
@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枚舉類的源碼,可以發現Mybatis-Plus中默認支持5種主鍵生成方式。
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; } }
值 | 描述 |
---|---|
AUTO | 數據庫 ID自增,這種情況下將表中主鍵設置為自增,否則,沒有設置主動設置id值進行插入時會報錯 |
NONE | 無狀態,該類型為未設置主鍵類型(注解里等于跟隨全局,全局里默認 ASSIGN_ID),注意這里官網文檔有誤 |
INPUT | insert 前自行 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 方法) |
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
Mybatis-Plus中的ID生成器主要分為2類,一類是IdentifierGenerator
,另一類是IKeyGenerator
。
源碼如下:
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); } }
源碼如下:
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 { /** * 主鍵ID */ @TableId(value = "id",type = IdType.ASSIGN_ID) private Long userId; private String name; private Integer age; private String email;
感謝各位的閱讀,以上就是“MybatisPlus主鍵生成策略是什么”的內容了,經過本文的學習后,相信大家對MybatisPlus主鍵生成策略是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。