1. 程式人生 > 程式設計 >詳解mybatis-plus使用@EnumValue註解的方式對列舉型別的處理

詳解mybatis-plus使用@EnumValue註解的方式對列舉型別的處理

前言:

在開發中,我們經常會用到諸如:性別(男/女)、稽核狀態(未稽核/稽核中/已稽核)之類的資料,通常會在資料庫中使用一個數字型別的欄位來標識,比如:性別,用1來表示男,2來表示女,而在程式碼中一般會定義成enum型別或靜態常量來避免在業務程式碼中出現“0/1”這種魔法值,但是在資料庫儲存及前後端互動的時候,就需要進行轉化;無論是在SQL、前端還是後臺轉化,都需要寫相應的程式碼,無形中增加了開發工作量;mybatis-plus實現了對該問題的處理,能夠讓我們在查詢資料庫時,直接能夠返回欄位標識的意思。配置如下:

第一步:

建立列舉類,在需要儲存資料庫的屬性上新增@EnumValue註解,在需要前端展示的屬性上新增@JsonValue註解;

package com.demo.mybatisplus.constant;

import com.baomidou.mybatisplus.annotation.EnumValue;
import com.fasterxml.jackson.annotation.JsonValue;

public enum SexEnum {

 MAN(1,"男"),WOMAN(2,"女");

 @EnumValue
 private Integer key;

 @JsonValue
 private String display;

 SexEnum(Integer key,String display) {
  this.key = key;
  this.display = display;
 }

 public Integer getKey() {
  return key;
 }

 public String getDisplay() {
  return display;
 }
}

第二步:

application.properties檔案裡新增配置,定義掃描列舉類的包路徑;

#配置列舉 支援萬用字元 * 或者 ; 分割
mybatis-plus.type-enums-package=com.demo.mybatisplus.constant
#mybatis-plus.configuration.default-enum-type-handler=org.apache.ibatis.type.EnumOrdinalTypeHandler

第三步:

pojo中的sex屬性設定為列舉SexEnum;

 @ApiModelProperty(value = "性別")
 @TableField("sex")
 private SexEnum sex;

測試:

 @Test
 public void insert() {
  UserInfo userInfo = new UserInfo();
  userInfo.setAge(22);
  userInfo.setName("李四");
  userInfo.setSex(SexEnum.WOMAN);
  userInfoMapper.insert(userInfo);
  System.out.println(userInfo);
 }

資料庫儲存的值:

ID NAME AGE SEX
1 張三 11 1
2 李四 22 2
3 王五 33 1

前端顯示的值:

[
 {"id":"1","name":"張三","age":11,"sex":"男"},{"id":"2","name":"李四","age":22,"sex":"女"},{"id":"3","name":"王五","age":33,"sex":"男"}
]

注意事項:

@EnumValue標記的列舉類屬性的型別要和資料庫欄位的型別對應,否則在查詢資料的時候無法轉化為列舉型別,並顯示為null;

如果查詢的時候,資料庫欄位的值匹配不到列舉,程式執行時並不會報錯,而是顯示為null;

在儲存的時候,前端需要傳遞@JsonValue標記的列舉類屬性的值,即"男/女";因為Enum的屬性ordinal(int),在測試過程中,傳列舉值在列舉類中的定義順序(或者稱為索引,順序從0開始),也可以轉換為相應的列舉值,比如:上面定義的SexEnum列舉,前端傳0或者"0",會轉換成MAN,傳1或者"1"會轉換成WOMAN;傳其他值會報異常:

com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type com.demo.mybatisplus.constant.SexEnum from String "3": not one of the values accepted for Enum class: [女,男]或com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of typecom.demo.mybatisplus.constant.SexEnum from number 3: index value outside legal index range [0..2];

到此這篇關於詳解mybatis-plus使用@EnumValue註解的方式對列舉型別的處理的文章就介紹到這了,更多相關mybatis-plus EnumValue列舉內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!