最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MyBatis-Plus 主鍵生成策略的幾種實(shí)現(xiàn)方式

 更新時(shí)間:2024年05月07日 09:46:55   作者:老貓喜歡今日爬山  
主鍵生成策略是指在數(shù)據(jù)庫中為每條記錄生成唯一標(biāo)識符的方法,本文就來介紹一下MyBatis-Plus 主鍵生成策略的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下

前言

很多人在使用Mybatis-Plus的時(shí)候可能會疑惑,自己明明沒有配置主鍵的生成策略,但是執(zhí)行新增操作時(shí)卻自動(dòng)生成了主鍵,而且還特別長。這是由于Mybatis-Plus默認(rèn)就會采用雪花算法填充主鍵字段。

今天就和大家詳解聊聊Mybatis-Plus中主鍵生成的相關(guān)策略。

一、官網(wǎng)

Mybatis-Plus主鍵策略

Mybatis-Plus自定義ID生成器

TIP??:
推薦學(xué)習(xí)框架的時(shí)候,多研究下官網(wǎng),獲取第一手資料。

二、主鍵注解@TableId說明

1、源碼

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

    IdType type() default IdType.NONE;
}
屬性類型必須指定默認(rèn)值描述
valueString“”主鍵字段名
typeEnumIdType.NONE生成主鍵類型

2、作用

  • 標(biāo)識主鍵字段
    使用@TableId可以標(biāo)識實(shí)體對象中和數(shù)據(jù)庫表中主鍵對應(yīng)的字段。如果不添加@TableId注解,會默認(rèn)匹配id字段為主鍵。
  • 變量名稱和主鍵字段名稱的匹配
    如果表中的主鍵字段名稱和實(shí)體中的主鍵字段名稱不相同,這時(shí)候就要通過@TableId中的value屬性明確指出對應(yīng)的數(shù)據(jù)庫主鍵字段的名稱。
  • 指定主鍵的生成方式
    可以通過@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枚舉類的源碼,可以發(fā)現(xiàn)Mybatis-Plus中默認(rèn)支持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數(shù)據(jù)庫 ID自增,這種情況下將表中主鍵設(shè)置為自增,否則,沒有設(shè)置主動(dòng)設(shè)置id值進(jìn)行插入時(shí)會報(bào)錯(cuò)
NONE無狀態(tài),該類型為未設(shè)置主鍵類型(注解里等于跟隨全局,全局里默認(rèn) ASSIGN_ID),注意這里官網(wǎng)文檔有誤
INPUTinsert 前自行 set 主鍵值,在采用IKeyGenerator類型的ID生成器時(shí)必須為INPUT
ASSIGN_ID分配 ID(主鍵類型為 Number(Long 和 Integer)或 String)(since 3.3.0),使用接口IdentifierGenerator的方法nextId(默認(rèn)實(shí)現(xiàn)類為DefaultIdentifierGenerator雪花算法)
ASSIGN_UUID分配 UUID,主鍵類型為 String(since 3.3.0),使用接口IdentifierGenerator的方法nextUUID(默認(rèn) default 方法)

3、全局設(shè)置

IdType默認(rèn)的全局設(shè)置為IdType.ASSIGN_ID,即由mybatis-plus主動(dòng)分配主鍵,默認(rèn)情況下由默認(rèn)主鍵生成器實(shí)現(xiàn)類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。

1、IdentifierGenerator

源碼如下:

public interface IdentifierGenerator {
    //根據(jù)id是否為null判斷是否需要主動(dòng)分配Id
    default boolean assignId(Object idValue) {
        return StringUtils.checkValNull(idValue);
    }

    //生成數(shù)值型Id
    Number nextId(Object entity);

    //生成字符型uuid
    default String nextUUID(Object entity) {
        return IdWorker.get32UUID();
    }
}

說明:

IdentifierGenerator生成器中主要提供了3個(gè)方法。

其使用場景是:不依賴數(shù)據(jù)庫生成ID,而是由mybatis-plus自己提供一套id生成算法。 對應(yīng)的主鍵生成方式為IdType.ASSIGN_ID、ASSIGN_UUID。

  • assignId 是否需要分配id
  • nextId 獲取下一個(gè)數(shù)值型Id
  • nextUUID 獲取下一個(gè)uuid

典型的實(shí)現(xiàn)是默認(rèn)的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的實(shí)現(xiàn)類
如果是默認(rèn)的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 {
    //執(zhí)行sql生成id
    String executeSql(String incrementerName);

    //獲取數(shù)據(jù)庫類型
    DbType dbType();
}

說明:IKeyGenerator 生成器主要是根據(jù)不同的數(shù)據(jù)庫類型,執(zhí)行sql語句生成對應(yīng)的主鍵。典型的數(shù)據(jù)庫如Oracle,Postgre,需要根據(jù)序列器生成表主鍵。

OracleKeyGenerator中的實(shí)現(xiàn):
可以發(fā)現(xiàn),是通過執(zhí)行sql調(diào)用序列器生成的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、在實(shí)體中通過@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具體實(shí)現(xiàn)類

@Bean
public IKeyGenerator keyGenerator() {
    return new OracleKeyGenerator();
}

也可以通過配置項(xiàng)指定:

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

四、自定義主鍵生成器

自定義主鍵生成器也有2種方式。

如果需要通過執(zhí)行sql語句來生成id的,可以通過實(shí)現(xiàn)IKeyGenerator接口來自定義。 如果不想依賴數(shù)據(jù)庫,完全自定義一套主鍵生成策略,那么可以通過實(shí)現(xiàn)IdentifierGenerator接口來擴(kuò)展。

下面演示如何通過實(shí)現(xiàn)IdentifierGenerator接口,自定義主鍵生成器。

1、自定義id生成器

@Component
public class CustomIdGenerator implements IdentifierGenerator {
    @Override
    public Long nextId(Object entity) {
      	//可以將當(dāng)前傳入的class全類名來作為bizKey,或者提取參數(shù)來生成bizKey進(jìn)行分布式Id調(diào)用生成.
      	String bizKey = entity.getClass().getName();
        //根據(jù)bizKey調(diào)用分布式ID生成
        long id = ....;
      	//返回生成的id值即可.
        return id;
    }
}

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

@Bean
public IdentifierGenerator idGenerator() {
    return new CustomIdGenerator();
}

3、實(shí)體類中指定主鍵分配策略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;

總結(jié)

本文主要是介紹了Mybatis-Plus主鍵生成策略及其相關(guān)的擴(kuò)展方法。

1、詳細(xì)介紹了@TableId注解的屬性和作用,推薦項(xiàng)目中在實(shí)體的主鍵字段上明確添加@TableId注解,標(biāo)識id字段以及id生成策略IdType。

2、目前mybatis-plus中有5種Id生成策略IdType,搞清楚各種的用法和使用場景。

  • AUTO 數(shù)據(jù)庫 ID自增
  • NONE 未設(shè)置主鍵類型,也就是跟隨全局策略,全局策略默認(rèn)為ASSIGN_ID
  • INPUT insert 前自行 set 主鍵值
  • ASSIGN_ID 分配 ID
  • ASSIGN_UUID 分配 UUID

3、Mybatis-Plus中的ID生成器主要分為2類,一類是IdentifierGenerator,另一類是IKeyGenerator,搞清楚他們的區(qū)別和各自的使用場景。

  • IdentifierGenerator 適用于不依賴數(shù)據(jù)庫,用戶自定義的主鍵生成場景。
  • IKeyGenerator 依賴數(shù)據(jù)庫,通過執(zhí)行sql語句生成主鍵的場景。

到此這篇關(guān)于MyBatis-Plus 主鍵生成策略的幾種實(shí)現(xiàn)方式的文章就介紹到這了,更多相關(guān)MyBatis-Plus 主鍵生成策略內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot實(shí)現(xiàn)多個(gè)子域共享cookie的示例

    SpringBoot實(shí)現(xiàn)多個(gè)子域共享cookie的示例

    本文主要介紹了SpringBoot實(shí)現(xiàn)多個(gè)子域共享cookie的示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • SpringBoot項(xiàng)目集成FTP的方法步驟

    SpringBoot項(xiàng)目集成FTP的方法步驟

    本文主要介紹了SpringBoot項(xiàng)目集成FTP的方法步驟,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • Spring工廠方法創(chuàng)建(實(shí)例化)bean實(shí)例代碼

    Spring工廠方法創(chuàng)建(實(shí)例化)bean實(shí)例代碼

    這篇文章主要介紹了Spring工廠方法創(chuàng)建bean實(shí)例代碼,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • mybatis?collection和association的區(qū)別解析

    mybatis?collection和association的區(qū)別解析

    這篇文章主要介紹了mybatis?collection解析以及和association的區(qū)別,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • SpringMVC Controller 返回值的可選類型詳解

    SpringMVC Controller 返回值的可選類型詳解

    本篇文章主要介紹了SpringMVC Controller 返回值的可選類型詳解 ,spring mvc 支持如下的返回方式:ModelAndView, Model, ModelMap, Map,View, String, void,有興趣的可以了解一下
    2017-05-05
  • mybatisX插件的使用及打包成配置

    mybatisX插件的使用及打包成配置

    本文主要介紹了mybatisX插件的使用及打包成配置,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-05-05
  • SpringBoot整合Hashids實(shí)現(xiàn)數(shù)據(jù)ID加密隱藏的全過程

    SpringBoot整合Hashids實(shí)現(xiàn)數(shù)據(jù)ID加密隱藏的全過程

    這篇文章主要為大家詳細(xì)介紹了SpringBoot整合Hashids實(shí)現(xiàn)數(shù)據(jù)ID加密隱藏的全過程,文中的示例代碼講解詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-01-01
  • Spring執(zhí)行流程和Bean的生命周期詳解

    Spring執(zhí)行流程和Bean的生命周期詳解

    這篇文章主要介紹了Spring執(zhí)行流程和Bean的生命周期詳解,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-06-06
  • Maven插件之Dependency:analyze的使用

    Maven插件之Dependency:analyze的使用

    在軟件開發(fā)中,合理管理項(xiàng)目依賴是保證構(gòu)建穩(wěn)定性的關(guān)鍵,Maven作為流行的項(xiàng)目管理工具,提供了Dependency插件來幫助開發(fā)者分析和優(yōu)化項(xiàng)目依賴,通過執(zhí)行dependency:analyze指令,可以辨識項(xiàng)目中使用的、未聲明的、和未使用的依賴項(xiàng)
    2024-10-10
  • java常用工具類之Excel操作類及依賴包下載

    java常用工具類之Excel操作類及依賴包下載

    這篇文章主要介紹了java常用工具類Excel操作類及依賴包下載,需要的朋友可以參考下
    2014-07-07

最新評論

高台县| 垦利县| 遂溪县| 哈尔滨市| 务川| 西乌珠穆沁旗| 井冈山市| 旬阳县| 龙江县| 荆门市| 广南县| 龙胜| 山阴县| 张家川| 苍南县| 龙江县| 石景山区| 于田县| 祥云县| 宁陕县| 郴州市| 陆丰市| 平陆县| 西青区| 荣昌县| 东乌珠穆沁旗| 五峰| 张家川| 东平县| 台北县| 兰溪市| 师宗县| 保康县| 阿瓦提县| 句容市| 雅江县| 惠州市| 义乌市| 东源县| 铜川市| 樟树市|