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

MyBatis-Plus 使用枚舉自動關聯(lián)注入

 更新時間:2021年06月22日 11:17:18   作者:秋田君  
本文主要介紹了MyBatis-Plus 使用枚舉自動關聯(lián)注入,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

什么是枚舉自動注入?

官方文檔是這么解釋的

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

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

實際效果

通常情況下,我們會這樣聲明一個用戶實體

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

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

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

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

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

實現(xiàn)步驟

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

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

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", "中國移動"),
    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解析時有效,若使用fastjson,請看官方文檔提供的解決方案
  • 不要把@JsonValue打成@JsonView了,否則自動關聯(lián)注入的是枚舉名(name屬性),如下所示
  • 別忘記實現(xiàn)IEnum接口,否則自動關聯(lián)注入的是枚舉名(name屬性),如下所示
{
        id: "1",
        name: "張三",
        age: "十八歲",
        phone: "CT"
}

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

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的枚舉自動關聯(lián)注入就完成了。

踩坑

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

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

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

當獲取IsEnableEnum的枚舉時,會執(zhí)行這行代碼獲取枚舉中的關系映射

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

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

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

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

解決方法

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

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

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

參數(shù)解析

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

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

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

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

響應結果

{
    "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": "/"
}

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

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

使用value屬性映射,經(jīng)過測試0對應的是ENABLE(1, "可用"),1對應的是LIMIT(-1, "禁用")。很奇葩吧,因此不推薦此方式。
使用desc屬性映射,將JSON請求參數(shù)改成如下就可以解析成功不報錯。

{
 "id":"922000984245391362",
 "isEnable":"禁用"
}

總結

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

針對于解決方法的選擇個人想法是,當存儲的值僅有兩個且關系相對時,可以使用方法二,而在任何場景下方法一都適用,因此個人比較推薦方法一,因為可以存儲更多的值和映射關系,例如上文的電話號碼枚舉。

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

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

相關文章

  • java策略枚舉:消除在項目里大批量使用if-else的優(yōu)雅姿勢

    java策略枚舉:消除在項目里大批量使用if-else的優(yōu)雅姿勢

    這篇文章主要給大家介紹了關于Java徹底消滅if-else的8種方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2021-06-06
  • 基于MybatisPlus插件TenantLineInnerInterceptor實現(xiàn)多租戶功能

    基于MybatisPlus插件TenantLineInnerInterceptor實現(xiàn)多租戶功能

    這篇文章主要介紹了基于MybatisPlus插件TenantLineInnerInterceptor實現(xiàn)多租戶功能,需要的朋友可以參考下
    2021-11-11
  • Spring?Boot實現(xiàn)熱部署的五種方式

    Spring?Boot實現(xiàn)熱部署的五種方式

    這篇文章主要介紹了Spring?Boot?五種熱部署方式,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-01-01
  • java中單雙斜杠的使用圖文詳解

    java中單雙斜杠的使用圖文詳解

    JAVA中的斜杠有正斜杠與反斜杠之分,正斜杠,一般就叫做斜杠,下面這篇文章主要給大家介紹了關于java中單雙斜杠使用的相關資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2022-09-09
  • 快速學會Dubbo的配置環(huán)境及相關配置

    快速學會Dubbo的配置環(huán)境及相關配置

    本文主要講解Dubbo的環(huán)境與配置,文中運用大量代碼和圖片講解的非常詳細,需要學習或用到相關知識的小伙伴可以參考這篇文章
    2021-09-09
  • Java如何調(diào)用Matlab程序

    Java如何調(diào)用Matlab程序

    這篇文章主要介紹了Java如何調(diào)用Matlab程序的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java設計模式之橋接模式

    Java設計模式之橋接模式

    這篇文章介紹了Java設計模式之橋接模式,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-09-09
  • springmvc實現(xiàn)文件上傳功能

    springmvc實現(xiàn)文件上傳功能

    這篇文章主要為大家詳細介紹了springmvc實現(xiàn)文件上傳功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • mybatis if test判斷BigDecimal遇到的坑及解決

    mybatis if test判斷BigDecimal遇到的坑及解決

    這篇文章主要介紹了mybatis if test判斷BigDecimal遇到的坑及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • 深入分析Java并發(fā)編程之CAS

    深入分析Java并發(fā)編程之CAS

    這篇文章主要介紹了Java并發(fā)編程之CAS的相關資料,幫助大家更好的理解和學習Java并發(fā)編程,感興趣的朋友可以了解下
    2020-08-08

最新評論

会东县| 青河县| 开平市| 西宁市| 沂水县| 库尔勒市| 集贤县| 浦东新区| 且末县| 宜都市| 平原县| 绥阳县| 即墨市| 孟村| 武夷山市| 高邮市| 拜城县| 佛山市| 巴彦淖尔市| 塔河县| 荆州市| 保德县| 东至县| 三门县| 邵武市| 平度市| 勃利县| 龙泉市| 林甸县| 扎兰屯市| 浦城县| 锡林郭勒盟| 永宁县| 扎兰屯市| 慈利县| 吉木萨尔县| 肇庆市| 安庆市| 鸡泽县| 潼关县| 获嘉县|