一文搞懂Mybatis Plus通用枚举功能使用

环境:
<mybatis-plus.version>3.4.2</mybatis-plus.version>
<spring-boot.version>2.4.2</spring-boot.version>

1. 配置文件添加配置

主要介绍MP通用枚举,其他配置省略!

# MP 配置
mybatis-plus:
  # 配置type-enums-package只对注解方式的枚举处理能提前加载缓存.
  type-enums-package: com.baomidou.mybatisplus.samples.enums.enums
  configuration:
    # 3.0.8之前版本问题默认将枚举注册为EnumOrdinalTypeHandler,这是错误的方式,默认是 org.apache.ibatis.type.EnumTypeHandler
    # 如果项目之中实体统一使用IEnum或注解的方式,可配置成 com.baomidou.mybatisplus.extension.handlers.EnumTypeHandler,也可省略上面的type-enums-package配置
    default-enum-type-handler: org.apache.ibatis.type.EnumOrdinalTypeHandler

2. 定义枚举

2.1 方式一

使用@EnumValue注解

package com.gangbb.test.enums;

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

/**
 * @Author Gangbb
 * @Description MP测试 状态enum (方式一)
 * @Date 2021/7/22
 **/
public enum StatusEnum{
    DISABLE(1, "禁用"),  ABLE(2, "启用"),  LOCK(3, "锁定");

    StatusEnum(int code, String name) {
        this.code = code;
        this.name = name;
    }

    @EnumValue//标记数据库记录的值是code
    private final int code;

    @JsonValue//标记响应json值
    private final String name;

    public static StatusEnum getEnum(String name) {
        for (StatusEnum item : values()) {
            if (item.getName().equals(name)) {
                return item;
            }
        }
        return null;
    }

    public int getCode() {
        return code;
    }

    public String getName() {
        return name;
    }
}

2.2 方式二

枚举属性,实现IEnum<T>接口。这里的字段代表值时String类型,IEnum<T>的泛型T就填入String类型。

package com.gangbb.test.enums;

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

/**
 * @Author Gangbb
 * @Description MP测试 状态enum (方式二)
 * @Date 2021/7/22
 **/
public enum LevelEnum implements IEnum<String> {

    DISABLE("a", "高级"),  ABLE("b", "中级"),  LOCK("c", "低级");

    private final String code;

    private final String name;

    LevelEnum(String code, String name) {
        this.code = code;
        this.name = name;
    }

    @Override
    public String getValue() {
        return code;
    }

    @JsonValue
    public String getName() {
        return name;
    }
}

2.3 方式三

其实是方式二的一种衍生。

先定义一个实现IEnum<T>接口的自定义IBaseEnum<T extends Serializable>接口,其中有一个getName()方法,我定的枚举喜欢代表值用code,对应的中文描述用name命名,所以叫getName()

package com.gangbb.test.enums;

import com.baomidou.mybatisplus.annotation.IEnum;

import java.io.Serializable;

/**
 * @Author Gangbb
 * @Description 自定义基类枚举
 * @Date 2021/7/22
 **/
public interface IBaseEnum<T extends Serializable> extends IEnum<T>{

    String getName();
}

然后枚举类实现这个接口,其实就是跟方式二一样的,但是实现这个接口,枚举类同时需要重写getValue()getName(),这样好形成一个规范,不管是命名还是使用上。

package com.gangbb.test.enums;

import com.fasterxml.jackson.annotation.JsonValue;

/**
 * @Author Gangbb
 * @Description TODO
 * @Date 2021/7/22
 **/
public enum VisitStageEnum implements IBaseEnum<Integer>{
    ONE(1, "一访"), TWO(2, "二访"), THREE(3, "三访");

    VisitStageEnum(int code, String name) {
        this.code = code;
        this.name = name;
    }

    private final int code;
    private final String name;

    @Override
    public Integer getValue() {
        return code;
    }

    @Override
    @JsonValue
    public String getName() {
        return name;
    }
}

3. 定义实体类

package com.gangbb.test.model.entity;

import com.gangbb.core.model.entity.BaseEntity;
import com.gangbb.test.enums.LevelEnum;
import com.gangbb.test.enums.StatusEnum;
import com.gangbb.test.enums.VisitStageEnum;

import java.io.Serializable;

/**
 * @Author Gangbb
 * @Description 测试mp实体类
 * @Date 2021/7/20
 **/
public class TestMybatisPlus extends BaseEntity implements Serializable {
    private static final long serialVersionUID = 8732481089448556962L;

    /**
     * 姓名
     */
    private String name;

    /**
     * 年龄
     */
    private Integer age;

    /**
     * 性别
     */
    private Integer sex;

    /**
     * 状态,原生枚举(带{@link com.baomidou.mybatisplus.annotation.EnumValue})
     * 数据库字段:status tinyint(2)
     */
    private StatusEnum status;

    /**
     * 等级,IEnum接口的枚举处理
     * 数据库字段:level char(4)
     */
    private LevelEnum level;

	
    private VisitStageEnum visitStage;

    // get/set方法省略
}

说一下自己封装的基类

4.测试使用

测试的用例:

  • 查询使用枚举值的实体,序列化返回前端后,是否会把代表值换成对应的中文值。
  • 使用枚举字段作为条件构造器的传入参数进行查询,看是否会用相应的代表值查询
  • 插入时,枚举字段传入中文值时,存入数据库会不会转成相应的代表值
/**
 * @Author Gangbb
 * @Description 测试MP通用枚举
 * @Date 2021/7/22
 **/
@RestController
@RequestMapping("/test/mp")
public class TestMPEnumController {

    @Autowired
    private TestMPService testMPService;

    @GetMapping("/enum1")
    public List<TestMybatisPlus> enum1(){
        return testMPService.findAll();
    }

    @GetMapping("/enum2")
    public List<TestMybatisPlus> enum2(){
        // 查询所有 启用 的记录
        QueryWrapper<TestMybatisPlus> wrapper = new QueryWrapper<>();
        wrapper.eq("status", StatusEnum.LOCK);
        return testMPService.findAllByWrapper(wrapper);
    }

    @PostMapping("/enum3")
    public ApiRestResponse enum3(){
        TestMybatisPlus mybatisPlus = new TestMybatisPlus();
        mybatisPlus.setName("测试枚举插入2");
        mybatisPlus.setSex(12);
        mybatisPlus.setAge(122);
        // 模拟传入的中文值字段值
        String a = "启用";
        mybatisPlus.setStatus(StatusEnum.getEnum(a));
        mybatisPlus.setLevel(LevelEnum.ABLE);
        mybatisPlus.setVisitStage(VisitStageEnum.ONE);
        testMPService.save(mybatisPlus);
        return ApiRestResponse.success();
    }

}

数据库中储存的记录:

在这里插入图片描述

结果:

/enum1

在这里插入图片描述

/enum2

传入枚举,查询时已转成相应的代表值:

在这里插入图片描述

/enum3

在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值