mybatis-plus?如何使用雪花算法ID生成策略
mybatis-plus 可以通過@TableId注解指定主鍵生成策略
@TableId(value="id",type=IdType.ASSIGN_ID)
| 值 | 描述 |
|---|---|
| AUTO | 數(shù)據(jù)庫ID自增 |
| NONE | 無狀態(tài),該類型為未設(shè)置主鍵類型(注解里等于跟隨全局,全局里約等于 INPUT) |
| INPUT | insert前自行set主鍵值 |
| ASSIGN_ID | 分配ID(主鍵類型為Number(Long和Integer)或String)(since 3.3.0),使用接口IdentifierGenerator的方法nextId(默認實現(xiàn)類為DefaultIdentifierGenerator雪花算法) |
| ASSIGN_UUID | 分配UUID,主鍵類型為String(since 3.3.0),使用接口IdentifierGenerator的方法nextUUID(默認default方法) |
| 分布式全局唯一ID 長整型類型(please use ASSIGN_ID) | |
| 32位UUID字符串(please use ASSIGN_UUID) | |
| 分布式全局唯一ID 字符串類型(please use ASSIGN_ID) |
上面的注解設(shè)置了值,對應(yīng)在MybatisDefaultParameterHandler中有判斷這個類型和設(shè)置ID的處理,判斷idType.getKey() == IdType.ASSIGN_ID.getKey()時,使用identifierGenerator.nextId(entity)創(chuàng)建了一個雪花算法ID。
protected static void populateKeys(TableInfo tableInfo, MetaObject metaObject, Object entity) {
IdType idType = tableInfo.getIdType();
String keyProperty = tableInfo.getKeyProperty();
if (StringUtils.isNotBlank(keyProperty) && null != idType && idType.getKey() >= 3) {
IdentifierGenerator identifierGenerator = GlobalConfigUtils.getGlobalConfig(tableInfo.getConfiguration()).getIdentifierGenerator();
Object idValue = metaObject.getValue(keyProperty);
if (StringUtils.checkValNull(idValue)) {
if (idType.getKey() == IdType.ASSIGN_ID.getKey()) {
if (Number.class.isAssignableFrom(tableInfo.getKeyType())) {
metaObject.setValue(keyProperty, identifierGenerator.nextId(entity));
} else {
metaObject.setValue(keyProperty, identifierGenerator.nextId(entity).toString());
}
} else if (idType.getKey() == IdType.ASSIGN_UUID.getKey()) {
metaObject.setValue(keyProperty, identifierGenerator.nextUUID(entity));
}
}
}
}
3.X版本后默認就是使用 IdType.ASSIGN_ID,即雪花算法,如果需要使用主鍵自增,則需要修改IdType.AUTO
看一下源碼大概找一下雪花算法的實現(xiàn)方式
首先來看主鍵生成策略的接口是IdentifierGenerator。mp中默認有一個實現(xiàn)類就是DefaultIdentifierGenerator,這個就是雪花算法的實現(xiàn)類。這個類中使用的Sequence就是雪花算法的實現(xiàn)類了。



如果想自己創(chuàng)建雪花算法手動創(chuàng)建ID怎么辦
com.baomidou.mybatisplus.core.toolkit包下有一個IdWork的類,這個類就是使用上面的DefaultIdentifierGenerator來獲取雪花算法ID,我們可以直接使用IdWork同名方法getId或者getIdStr來手動獲取一個雪花算法ID。
Long id=IdWorker.getIdStr()
自定義ID生成器實現(xiàn)
第一種,使用spring掃描注解創(chuàng)建bean使用
@Component
public class CustomIdGenerator implements IdentifierGenerator {
@Override
public Long nextId(Object entity) {
//可以將當前傳入的class全類名來作為bizKey,或者提取參數(shù)來生成bizKey進行分布式Id調(diào)用生成.
String bizKey = entity.getClass().getName();
//根據(jù)bizKey調(diào)用分布式ID生成
long id = ....;
//返回生成的id值即可.
return id;
}
}
第二種,直接把寫好的CustomIdGenerator實現(xiàn)類配置為一個bean
@Bean
public IdentifierGenerator idGenerator() {
return new CustomIdGenerator();
}
Mybatis-plus 中生成雪花算法id的工具類
public static void main(String[] args) {
// 返回值 1385106677482582018
System.out.println(IdWorker.getId());
// 返回值 "1385106677482582019"
System.out.println(IdWorker.getIdStr());
}
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
在webservice里調(diào)用耗時方法出錯的解決方案
這篇文章主要介紹了在webservice里調(diào)用耗時方法出錯的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07
基于Spring Security實現(xiàn)對密碼進行加密和校驗
我們在入門案例中,其實已經(jīng)是一個非常簡單的認證,但是用戶名是寫死的,密碼也需要從控制臺查看,很顯然實際中并不能這么做,下面的學習中,我們來實現(xiàn)基于內(nèi)存模型的認證以及用戶的自定義認證,密碼加密等內(nèi)容,需要的朋友可以參考下2024-07-07
IDEA Ultimate2020.2版本配置Tomcat詳細教程
這篇文章主要介紹了IDEA Ultimate2020.2版本配置Tomcat教程,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-09-09
Spring-boot oauth2使用RestTemplate進行后臺自動登錄的實現(xiàn)
這篇文章主要介紹了Spring-boot oauth2使用RestTemplate進行后臺自動登錄的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-07-07
SpringBoot中利用@Valid和@Validated進行參數(shù)校驗
為了保證數(shù)據(jù)的正確性、完整性,前后端都需要進行數(shù)據(jù)檢驗,作為一名后端開發(fā)工程師,不能僅僅依靠前端來校驗數(shù)據(jù),我們還需要對接口請求的參數(shù)進行后端的校驗,所以本文給大家介紹了SpringBoot中利用@Valid和@Validated進行參數(shù)校驗,需要的朋友可以參考下2024-09-09
Spring中的ContextLoaderListener詳細解析
這篇文章主要介紹了Spring中的ContextLoaderListener詳細解析,在web容器即Tomact容器啟動web應(yīng)用即servlet應(yīng)用時,會觸發(fā)ServletContextEvent時間,這個事件會被ServletContextListener監(jiān)聽,需要的朋友可以參考下2023-12-12

