先来看一下最终效果。
通常情况下,我们会这样声明一个用户实体
public class User { private String id; private String name; private Integer age; private String phone; //省略getter&setter&constructor ... }
那么最终获取到的JSON数据应该类似于这样
{ id: "1", name: "张三", age: 18, phone: "10000" }
如若使用MyBatis-Plus的枚举自动关联注入,可以更优雅的实现如下效果
{ id: "1", name: "张三", age: "十八岁", phone: "中国电信" }
实现过程很简单,代码量也非常少,下面简单介绍一下。
首先,创建两个枚举对象,分别为AgeEnum与PhoneEnum,这里使用枚举建立一个映射关系。
public enum AgeEnum implements IEnum { ONE(1, "一岁"), TWO(2, "二岁"); private int value; private String desc; AgeEnum(final int value, final String desc) { this.value = value; this.desc = desc; } @Override public Serializable getValue() { return this.value; } @JsonValue public String getDesc(){ return this.desc; } }
public enum PhoneEnum implements IEnum { CMCC("10086", "中国移动"), CUCC("10010", "中国联通"), CT("10000", "中国电信"); private String value; private String desc; PhoneEnum(final String value, final String desc) { this.value = value; this.desc = desc; } @Override public Serializable getValue() { return this.value; } @JsonValue public String getDesc(){ return this.desc; } }
注意:
1.@JsonValue是使用JackSon解析时有效,若使用fastjson,请看官方文档提供的解决方案
2.不要把@JsonValue打成@JsonView了,否则自动关联注入的是枚举名(name属性),如下所示
{
id: "1",
name: "张三",
age: "十八岁",
phone: "CT"
}
3.别忘记实现IEnum接口,否则自动关联注入的是枚举名(name属性),效果如上所示
其次,将User实体中的属性替换为枚举,例如
public class User {
private String id;
private String name;
private AgeEnum age;
private PhoneEnum phone;
//省略getter&setter&constructor
...
}
最后,配置扫描枚举,添加如下配置
mybatis-plus.typeEnumsPackage=com.xxx.xxx.enums//枚举所在路径
至此,使用MyBatis-Plus的枚举自动关联注入就完成了。
在使用枚举自动关联注入时,还踩了一个坑。
代码正确的情况下出现了如下问题
{
id: null,
name: null,
age: null,
phone: null
}
查出的所有值都为null,通过DEBUG跟踪代码发现问题
数据库中将实体中的某个枚举属性设置为了tinyint类型,在数据库中存储的值是1,枚举中也使用1来映射关系,而MyBaits-Plus在获取值是读成了true,因此没有映射成功,返回null
当获取IsEnableEnum的枚举时,会执行这行代码获取枚举中的关系映射
EnumUtils.valueOf(this.type, rs.getObject(columnName));
但是MyBatis读取到的值变成了true
无法正确匹配到映射的值,返回null,IsEnableEnum中声明的映射关系如下。
ENABLE(1, "可用"), LIMIT(-1, "禁用");
简单粗暴的解决方案就是将表中IsEnableEnum枚举对应的属性类型由tinyint改为int即可。
最后,贴上MyBatis-Plus的官方文档,强烈推荐小伙伴们去尝试使用,非常棒的一个开源项目。