MyBatis-Plus 使用枚举自动关联注入

先来看一下最终效果。

通常情况下,我们会这样声明一个用户实体

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的官方文档,强烈推荐小伙伴们去尝试使用,非常棒的一个开源项目。

猜你喜欢

转载自my.oschina.net/u/3773384/blog/1802992
今日推荐