1. 配置文件添加配置
# MP 配置mybatis-plus:type-enums-package: com.baomidou.mybatisplus.samples.enums.enumsconfiguration:# 3.0.8之前版本问题默认将枚举注册为EnumOrdinalTypeHandler,这是错误的方式,默认是 org.apache.ibatis.type.EnumTypeHandler# 如果项目之中实体统一使用IEnum或注解的方式,可配置成 com.baomidou.mybatisplus.extension.handlers.EnumTypeHandler,也可省略上面的type-enums-package配置# 配置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
**/publicenum StatusEnum{DISABLE(1,"禁用"),ABLE(2,"启用"),LOCK(3,"锁定");StatusEnum(int code, String name){this.code= code;this.name= name;}@EnumValue//标记数据库记录的值是codeprivatefinalint code;@JsonValue//标记响应json值privatefinal String name;publicstatic StatusEnumgetEnum(String name){for(StatusEnum item:values()){if(item.getName().equals(name)){return item;}}return null;}publicintgetCode(){return code;}public StringgetName(){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
**/publicenum LevelEnumimplementsIEnum<String>{DISABLE("a","高级"),ABLE("b","中级"),LOCK("c","低级");privatefinal String code;privatefinal String name;LevelEnum(String code, String name){this.code= code;this.name= name;}@Overridepublic StringgetValue(){return code;}@JsonValuepublic StringgetName(){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
**/publicinterfaceIBaseEnum<TextendsSerializable>extendsIEnum<T>{
StringgetName();}
然后枚举类实现这个接口,其实就是跟方式二一样的,但是实现这个接口,枚举类同时需要重写getValue()
和getName()
,这样好形成一个规范,不管是命名还是使用上。
package com.gangbb.test.enums;import com.fasterxml.jackson.annotation.JsonValue;/**
* @Author Gangbb
* @Description TODO
* @Date 2021/7/22
**/publicenum VisitStageEnumimplementsIBaseEnum<Integer>{ONE(1,"一访"),TWO(2,"二访"),THREE(3,"三访");VisitStageEnum(int code, String name){this.code= code;this.name= name;}privatefinalint code;privatefinal String name;@Overridepublic IntegergetValue(){return code;}@Override@JsonValuepublic StringgetName(){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
**/publicclassTestMybatisPlusextendsBaseEntityimplementsSerializable{privatestaticfinallong 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")publicclassTestMPEnumController{@Autowiredprivate TestMPService testMPService;@GetMapping("/enum1")public List<TestMybatisPlus>enum1(){return testMPService.findAll();}@GetMapping("/enum2")public List<TestMybatisPlus>enum2(){// 查询所有 启用 的记录
QueryWrapper<TestMybatisPlus> wrapper=newQueryWrapper<>();
wrapper.eq("status", StatusEnum.LOCK);return testMPService.findAllByWrapper(wrapper);}@PostMapping("/enum3")public ApiRestResponseenum3(){
TestMybatisPlus mybatisPlus=newTestMybatisPlus();
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
: