欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MyBatis-Plus如何使用枚舉自動(dòng)關(guān)聯(lián)注入詳解

 更新時(shí)間:2022年03月08日 10:27:07   作者:秋田君  
這篇文章主要給大家介紹了關(guān)于MyBatis-Plus如何使用枚舉自動(dòng)關(guān)聯(lián)注入的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用MyBatis-Plus具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

什么是枚舉自動(dòng)注入?

官方文檔是這么解釋的

解決了繁瑣的配置,讓 mybatis 優(yōu)雅的使用枚舉屬性!

按我的理解是維護(hù)在內(nèi)存中且不易修改的輕量級(jí)字典。目前覺得這個(gè)功能的使用場景相對(duì)有限,但是如果有用到的話開箱即用也是很棒的。廢話不多說,接下來讓我們看一下它的實(shí)際效果吧。

實(shí)際效果

通常情況下,我們會(huì)這樣聲明一個(gè)用戶實(shí)體

public class User {
????private String id;
    private String name;
    private Integer age;
    private String phone;
????//省略getter&setter&constructor
????...
}

那么最終獲取到的JSON數(shù)據(jù)應(yīng)該類似于這樣

{
        id: "1",
        name: "張三",
        age: 18,
        phone: "10000"
}

如若使用MyBatis-Plus的枚舉自動(dòng)關(guān)聯(lián)注入,可以更優(yōu)雅的實(shí)現(xiàn)如下效果

{
        id: "1",
????????name: "張三",
        age: "十八歲",
        phone: "中國電信"
}

實(shí)現(xiàn)步驟

實(shí)現(xiàn)過程僅有三步且非常簡單,代碼量也非常的少,下面介紹一下實(shí)現(xiàn)步驟。

1.創(chuàng)建兩個(gè)枚舉對(duì)象,分別為AgeEnum與PhoneEnum,這里使用枚舉建立一個(gè)映射關(guān)系。

public enum AgeEnum implements IEnum {
    ONE(1, "一歲"),
    TWO(2, "二歲");

    private int age;
    private String desc;

    AgeEnum(final int age, final String desc) {
        this.age = age;
        this.desc = desc;
    }

    @Override
    public Serializable getValue() {
        return this.age;
    }

    @JsonValue
    public String getDesc(){
        return this.desc;
    }
}
public enum PhoneEnum implements IEnum {
    CMCC("10086", "中國移動(dòng)"),
    CUCC("10010", "中國聯(lián)通"),
    CT("10000", "中國電信");

    private String phone;
    private String desc;

    PhoneEnum(final String phone, final String desc) {
        this.phone = phone;
        this.desc = desc;
    }

    @Override
    public Serializable getValue() {
        return this.phone;
    }

    @JsonValue
    public String getDesc(){
        return this.desc;
    }
}

注意:

  • @JsonValue是使用JackSon解析時(shí)有效,若使用fastjson,請(qǐng)看官方文檔提供的解決方案
  • 不要把@JsonValue打成@JsonView了,否則自動(dòng)關(guān)聯(lián)注入的是枚舉名(name屬性),如下所示
  • 別忘記實(shí)現(xiàn)IEnum接口,否則自動(dòng)關(guān)聯(lián)注入的是枚舉名(name屬性),如下所示
{
        id: "1",
????????name: "張三",
        age: "十八歲",
        phone: "CT"
}

    2.將User實(shí)體中的屬性替換為枚舉,例如

public class User {
????private String id;
    private String name;
    private AgeEnum age;
    private PhoneEnum phone;
????//省略getter&setter&constructor
????...
}

    3.配置掃描枚舉,添加如下配置

mybatis-plus.typeEnumsPackage=com.xxx.xxx.enums//枚舉所在路徑

至此,使用MyBatis-Plus的枚舉自動(dòng)關(guān)聯(lián)注入就完成了。

踩坑

在使用枚舉自動(dòng)關(guān)聯(lián)注入時(shí),還踩了一個(gè)坑。在代碼正確的情況下出現(xiàn)了如下問題。

{
        id: null,
????????name: null,
        age: null,
        phone: null
}

查出的所有值都為null,通過DEBUG跟蹤代碼發(fā)現(xiàn)問題。數(shù)據(jù)庫中將實(shí)體中的某個(gè)枚舉屬性設(shè)置為了tinyint類型,在數(shù)據(jù)庫中存儲(chǔ)的值是1,枚舉中也是使用1來映射關(guān)系,然而MyBaits-Plus在獲取值是卻讀成了true,因此枚舉并沒有映射成功,返回null值。

當(dāng)獲取IsEnableEnum的枚舉時(shí),會(huì)執(zhí)行這行代碼獲取枚舉中的關(guān)系映射

EnumUtils.valueOf(this.type, rs.getObject(columnName));

但是MyBatis讀取到的值變成了true

無法正確匹配到映射的值,返回null值,IsEnableEnum中聲明的映射關(guān)系如下。

ENABLE(1, "可用"), LIMIT(-1, "禁用");

解決方法

    1.將表中IsEnableEnum枚舉對(duì)應(yīng)的字段is_enable類型由tinyint改為int即可,這種解決方法的優(yōu)點(diǎn)就是不用修改代碼就解決問題。

    2.MySQL中tinyint(1)對(duì)應(yīng)Java中的boolean類型,非0為true,0為false。因此修改IsEnableEnum中的映射關(guān)系,如下。

ENABLE(true, "可用"), LIMIT(false, "禁用");

參數(shù)解析

當(dāng)使用枚舉注入的方式時(shí),作為參數(shù)解析如果不注意會(huì)出現(xiàn)解析異常的情況。這里以修改User的is_enable值(數(shù)據(jù)庫表中字段屬性設(shè)置為int)為例看下具體解析異常情況的問題。例如,我們需要通過下面這個(gè)接口接收J(rèn)SON請(qǐng)求參數(shù)來修改用戶的信息。

@PostMapping
public User saveUser(@RequestBody User user) {
    return userService.insertOrUpdate(user) ? userService.selectById(user.getId()) : null;
}

使用Postman模擬請(qǐng)求,JSON參數(shù)

{
	"id":"922000984245391362",
	"isEnable":-1
}

響應(yīng)結(jié)果

{
    "timestamp": "2018-05-12T04:20:15.920+0000",
    "status": 400,
    "error": "Bad Request",
    "exception": "org.springframework.http.converter.HttpMessageNotReadableException",
    "message": "JSON parse error: Can not deserialize value of type com.github.common.domain.enums.IsEnableEnum from number -1: index value outside legal index range [0..1]; nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Can not deserialize value of type com.github.common.domain.enums.IsEnableEnum from number -1: index value outside legal index range [0..1]\n at [Source: java.io.PushbackInputStream@25386a8e; line: 3, column: 13] (through reference chain: com.github.common.domain.User[\"isEnable\"])",
    "path": "/"
}

從錯(cuò)誤信息我們可知,無法將-1映射成IsEnableEnum枚舉,可用范圍是0..1,那么應(yīng)該怎么解決呢?

自己摸索出的解決方式有兩種,分別為

  • 使用value屬性映射,經(jīng)過測試0對(duì)應(yīng)的是ENABLE(1, "可用"),1對(duì)應(yīng)的是LIMIT(-1, "禁用")。很奇葩吧,因此不推薦此方式。
  • 使用desc屬性映射,將JSON請(qǐng)求參數(shù)改成如下就可以解析成功不報(bào)錯(cuò)。
{
	"id":"922000984245391362",
	"isEnable":"禁用"
}

總結(jié)

MyBatis-Plus這個(gè)特性目前用的還是不多,本質(zhì)上其實(shí)還是把映射關(guān)系寫死在代碼中且個(gè)人覺得設(shè)計(jì)有些許不合理的地方,并不能替代字典,因此還是推薦使用字典方式,可以動(dòng)態(tài)的修改映射關(guān)系。當(dāng)項(xiàng)目遇到希望使用比字典更輕更快更容易上手的場景時(shí),可以嘗試使用枚舉注入的方式。

針對(duì)于解決方法的選擇個(gè)人想法是,當(dāng)存儲(chǔ)的值僅有兩個(gè)且關(guān)系相對(duì)時(shí),可以使用方法二,而在任何場景下方法一都適用,因此個(gè)人比較推薦方法一,因?yàn)榭梢源鎯?chǔ)更多的值和映射關(guān)系,例如上文的電話號(hào)碼枚舉。

最后,貼上MyBatis-Plus的官方文檔,強(qiáng)烈推薦小伙伴們?nèi)L試使用,非常棒的一個(gè)開源項(xiàng)目。

到此這篇關(guān)于MyBatis-Plus如何使用枚舉自動(dòng)關(guān)聯(lián)注入的文章就介紹到這了,更多相關(guān)MyBatis-Plus枚舉自動(dòng)關(guān)聯(lián)注入內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JetBrains推出全新IDE之Fleet詳解

    JetBrains推出全新IDE之Fleet詳解

    當(dāng)您第一次啟動(dòng) Fleet 時(shí),它會(huì)作為一個(gè)功能齊全的編輯器啟動(dòng),具有語法高亮顯示、簡單的代碼補(bǔ)全以及您對(duì)一個(gè)編輯器期待的所有功能,本文學(xué)習(xí)下JetBrains推出全新IDE之Fleet相關(guān)知識(shí),感興趣的朋友跟隨小編一起看看吧
    2021-12-12
  • Springboot如何通過流返回文件

    Springboot如何通過流返回文件

    這篇文章主要介紹了Springboot如何通過流返回文件,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Spring Boot異步調(diào)用@Async過程詳解

    Spring Boot異步調(diào)用@Async過程詳解

    這篇文章主要介紹了Spring Boot異步調(diào)用@Async過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • Java利用遞歸算法實(shí)現(xiàn)查詢斐波那契數(shù)

    Java利用遞歸算法實(shí)現(xiàn)查詢斐波那契數(shù)

    今天小編就為大家分享一篇關(guān)于Java利用遞歸算法實(shí)現(xiàn)查詢斐波那契數(shù),小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • 使用Java實(shí)現(xiàn)希爾排序算法的簡單示例

    使用Java實(shí)現(xiàn)希爾排序算法的簡單示例

    這篇文章主要介紹了使用Java實(shí)現(xiàn)希爾排序算法的簡單示例,希爾排序可以被看作是插入排序的一種更高效的改進(jìn)版本,需要的朋友可以參考下
    2016-05-05
  • 淺析Java語言中狀態(tài)模式的優(yōu)點(diǎn)

    淺析Java語言中狀態(tài)模式的優(yōu)點(diǎn)

    狀態(tài)模式允許對(duì)象在內(nèi)部狀態(tài)改變時(shí)改變它的行為,對(duì)象看起來好像修改了它的類。這個(gè)模式將狀態(tài)封裝成獨(dú)立的類,并將動(dòng)作委托到 代表當(dāng)前狀態(tài)的對(duì)象,我們知道行為會(huì)隨著內(nèi)部狀態(tài)而改變
    2023-02-02
  • Spark網(wǎng)站日志過濾分析實(shí)例講解

    Spark網(wǎng)站日志過濾分析實(shí)例講解

    這篇文章主要介紹了Spark網(wǎng)站日志過濾分析實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2023-02-02
  • sms4j?2.0?全新來襲功能的調(diào)整及maven變化詳解

    sms4j?2.0?全新來襲功能的調(diào)整及maven變化詳解

    這篇文章主要介紹了sms4j?2.0?全新來襲功能的調(diào)整及maven變化詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • JavaMail郵件簡介及API概述第一篇

    JavaMail郵件簡介及API概述第一篇

    這篇文章主要為大家詳細(xì)介紹了JavaMail郵件簡介及API概述第一篇,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • 詳解Java類動(dòng)態(tài)加載和熱替換

    詳解Java類動(dòng)態(tài)加載和熱替換

    本文主要介紹類加載器、自定義類加載器及類的加載和卸載等內(nèi)容,并舉例介紹了Java類的熱替換。
    2021-05-05

最新評(píng)論