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

MyBatisPlus枚舉處理器的實現(xiàn)

 更新時間:2026年03月04日 10:50:27   作者:ruleslol  
MyBatis-Plus?提供了枚舉處理器,讓我們可以優(yōu)雅地在數(shù)據(jù)庫字段和Java?枚舉之間進(jìn)行轉(zhuǎn)換,而不需要手動處理映射關(guān)系,下面就來詳細(xì)的介紹一下,感興趣的可以了解一下

MyBatis-Plus 提供了枚舉處理器,讓我們可以優(yōu)雅地在數(shù)據(jù)庫字段Java 枚舉之間進(jìn)行轉(zhuǎn)換,而不需要手動處理映射關(guān)系。

一、為什么需要枚舉處理器?

數(shù)據(jù)庫中通常用 0/1'A'/'B' 這樣的值表示狀態(tài),而 Java 中我們希望使用枚舉類型。沒有枚舉處理器時,需要手動轉(zhuǎn)換,容易出錯且代碼冗余。

二、實現(xiàn)方式

在枚舉字段上加 @EnumValue,標(biāo)記哪個字段的值存入數(shù)據(jù)庫:

示例:

【備注】:

類型處理器多是由mybatis提供;

但是mybatis-plus在此基礎(chǔ)上,添加了兩個常用的類型處理器

2-1、實現(xiàn)步驟

1、通過注解@EnumValue,告訴mp,枚舉中的哪一個字段作為數(shù)據(jù)庫中的存值

2、通過配置項,讓枚舉處理器生效

3、對于枚舉的返回值,由springMVC中的Jackson json處理,通過注解@JsonValue,標(biāo)記返回枚舉中的哪一個值。

2-2、小結(jié):

三、反序列化時(接收前端參數(shù)),配合@JsonCreator

前端傳來 JSON 數(shù)據(jù) → Java 把它轉(zhuǎn)換成對象,這個過程會遇到坑!

若是枚舉示例如下:

按照當(dāng)前邏輯,當(dāng)傳值是desc字符串時:

{
    "username":"商叢書6",
    "email":"shang@qq.com",
    "age":22,
    "status":"凍結(jié)"
}

數(shù)據(jù)庫存值沒有問題。

但是當(dāng)傳值是value時:

{
    "username":"商叢書7",
    "email":"shang@qq.com",
    "age":22,
    "status":1
}

存值有誤:

原因:

因為 Jackson 默認(rèn)支持按枚舉的 ordinal(下標(biāo)順序)來反序列化,而不是你 @EnumValue 定義的 code 值:

public enum UserStatus {
    NORMAL(1, "正常"),   // ordinal=0,code=1
    FROZEN(-1, "凍結(jié)"); // ordinal=1,code=0
}

整個鏈路:

Postman 傳 "凍結(jié)"
    ↓ Jackson 反序列化(@JsonValue 的 desc 字段匹配)
UserStatus.NORMAL 枚舉對象
    ↓ MyBatis-Plus 寫庫(@EnumValue 的 value 字段)
數(shù)據(jù)庫存 -1
Postman 傳 1
    ↓ Jackson 按 ordinal 匹配(第1個枚舉)
UserStatus.FROZEN 枚舉對象
    ↓ MyBatis-Plus 寫庫
數(shù)據(jù)庫存 -1

3-1、解決方法:@JsonCreator

在枚舉里加 @JsonCreator 方法,根據(jù)你想支持的傳值方式來寫。

@JsonCreator 是加在枚舉類里的一個靜態(tài)方法上,這個方法你自己來寫:

@Getter
public enum UserStatus {

    NORMAL(1, "正常"),
    FROZEN(-1, "凍結(jié)");

    @EnumValue
    private int value;
    @JsonValue
    private String desc;

    UserStatus(int value, String desc) {
        this.value = value;
        this.desc = desc;
    }

    @JsonCreator
    public static UserStatus of(int value){
        for (UserStatus e : values()){
            if(value == e.value){
                return e;
            }
        }
        throw new IllegalArgumentException("無效的狀態(tài)值: " + value);
    }
}

這樣前端傳 "status": 1 時,Jackson 就會調(diào)用這個 of(1) 方法,按 value 字段去匹配枚舉,而不是按 ordinal 順序,避免了之前說的那個坑。

【注意】:方法名不一定叫of?。。?/p>

名字隨便起,@JsonCreator 才是關(guān)鍵,Jackson 認(rèn)的是這個注解,不是方法名。

叫什么都行:

@JsonCreator
public static UserStatus fromCode(int code) { ... }

@JsonCreator
public static UserStatus getByCode(int code) { ... }

@JsonCreator
public static UserStatus create(int code) { ... }

of 只是一個約定俗成的命名習(xí)慣,參考了 Java 標(biāo)準(zhǔn)庫的風(fēng)格(比如 Optional.of()、LocalDate.of() 等),看起來簡潔,但并不是強(qiáng)制要求。

一個枚舉里只能有一個 @JsonCreator 方法,因為 Jackson 反序列化時只能有一個入口,多了它不知道該用哪個,會報錯。

如果你想同時支持?jǐn)?shù)字和字符串,就在這一個方法里做兼容處理:

@JsonCreator
public static UserStatus of(Object val) {
    String str = val.toString().trim();
    for (UserStatus e : values()) {
        // 既能匹配 code(數(shù)字),也能匹配 desc(中文)
        if (String.valueOf(e.code).equals(str) || e.desc.equals(str)) {
            return e;
        }
    }
    throw new IllegalArgumentException("無效的狀態(tài)值: " + val);
}

這樣前端傳 0 或者 "正常" 都能正確匹配。

到此這篇關(guān)于MyBatisPlus枚舉處理器的實現(xiàn)的文章就介紹到這了,更多相關(guān)MyBatisPlus枚舉處理器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java畢業(yè)設(shè)計實戰(zhàn)之寵物醫(yī)院與商城一體的系統(tǒng)的實現(xiàn)

    Java畢業(yè)設(shè)計實戰(zhàn)之寵物醫(yī)院與商城一體的系統(tǒng)的實現(xiàn)

    這是一個使用了java+Springboot+Jsp+maven+Mysql開發(fā)的寵物醫(yī)院與商城一體的系統(tǒng),是一個畢業(yè)設(shè)計的實戰(zhàn)練習(xí),具有寵物醫(yī)院和寵物商城該有的所有功能,感興趣的朋友快來看看吧
    2022-02-02
  • SpringMVC配置javaConfig及StringHttpMessageConverter示例

    SpringMVC配置javaConfig及StringHttpMessageConverter示例

    這篇文章主要介紹了SpringMVC配置javaConfig及StringHttpMessageConverter實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • Java final與泛型詳細(xì)解析

    Java final與泛型詳細(xì)解析

    文章主要介紹了Java中的final關(guān)鍵字、泛型以及包裝類,final關(guān)鍵字用于確保變量、方法和類不會被修改,本文結(jié)合實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2025-11-11
  • javaweb 項目初始配置的方法步驟

    javaweb 項目初始配置的方法步驟

    本文主要介紹了javaweb 項目初始配置的方法步驟,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • 深入Java注解原理Annotation

    深入Java注解原理Annotation

    這篇文章主要介紹了深入Java注解原理Annotation,注解可以附加在package,class,method,field等上面,可相當(dāng)于添加了額外的輔助信息,可以通過反射機(jī)制編程實現(xiàn)對這些元數(shù)據(jù)的訪問,需要的朋友可以參考下
    2023-10-10
  • Java實現(xiàn)經(jīng)典游戲打磚塊游戲的示例代碼

    Java實現(xiàn)經(jīng)典游戲打磚塊游戲的示例代碼

    這篇文章主要介紹了如何利用Java實現(xiàn)經(jīng)典的游戲—打磚塊。玩家操作一根螢?zāi)簧纤降摹鞍糇印保屢活w不斷彈來彈去的“球”在撞擊作為過關(guān)目標(biāo)消去的“磚塊”的途中不會落到螢?zāi)坏紫?。感興趣的小伙伴可以了解一下
    2022-02-02
  • 解讀@SpringBootApplication注解有什么用

    解讀@SpringBootApplication注解有什么用

    @SpringBootApplication是SpringBoot的核心注解,主要包含@SpringBootConfiguration、@EnableAutoConfiguration和@ComponentScan三個注解,這些注解共同簡化了Spring應(yīng)用的配置工作,并使得通過主程序類就可以啟動SpringBoot應(yīng)用
    2024-09-09
  • Mybatis參數(shù)處理的幾種方法小結(jié)

    Mybatis參數(shù)處理的幾種方法小結(jié)

    在Mybatis中如何處理參數(shù)是一個非常重要的環(huán)節(jié),本文將詳細(xì)介紹 Mybatis 的參數(shù)處理機(jī)制,包括傳入?yún)?shù)和返回參數(shù)的處理方式,具有一定的參考價值,感興趣的可以了解一下
    2023-08-08
  • mybatis動態(tài)插入list傳入List參數(shù)的實例代碼

    mybatis動態(tài)插入list傳入List參數(shù)的實例代碼

    本文通過實例代碼給大家介紹了mybatis動態(tài)插入list,Mybatis 傳入List參數(shù)的方法,非常不錯,具有參考借鑒價值,需要的朋友參考下吧
    2018-04-04
  • idea的運(yùn)行按鈕是灰色問題及解決

    idea的運(yùn)行按鈕是灰色問題及解決

    這篇文章主要介紹了idea的運(yùn)行按鈕是灰色問題及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08

最新評論

射洪县| 定襄县| 二连浩特市| 商河县| 遂溪县| 九寨沟县| 中方县| 潢川县| 宜春市| 建德市| 三河市| 秦皇岛市| 恭城| 永仁县| 安吉县| 河津市| 姜堰市| 新兴县| 吉木乃县| 凌海市| 喀喇沁旗| 上栗县| 宁明县| 沁源县| 楚雄市| 西城区| 惠水县| 西华县| 盖州市| 称多县| 铅山县| 资溪县| 和静县| 桑日县| 武汉市| 集贤县| 运城市| 镇平县| 静海县| 明溪县| 榆中县|