迁移原先公司工作时总结的内容
MyBatis-Plus 提供枚举映射字段的策略,解决了繁琐的配置,让 mybatis 优雅的使用枚举属性!
如我们的数据库中的表中有这样一个字段“`deleted` int(2) DEFAULT ‘0’ COMMENT ‘删除标志(0:正常,1:删除)’”,那么我们在写实体Entity时,一般会对该字段有如下策略。
1、将该字段的类型定义Integer,然后编写代码时指定其int值。
2、将该字段的类型为枚举,如下,然后编写代码时,getIntValue(),指定真正的value值。(如果不指定value值,直接插入枚举的话,默认插入的值是枚举的oridinal,枚举值声明时的顺序,从0开始,一般这样不符合我们的业务定义)
public enum DeleteEnum { /** 已删除 */ YES(true, 1, "已删除"), /** 未删除 */ NO(false, 0, "未删除"); private boolean key; private int value; private String name; DeleteEnum(boolean key, int value, String name) { this.key = key; this.value = value; this.name = name; } /** * 获取整型值 * * @return */ public int getIntValue() { return this.value; } }
但显然上述两种方式会比较麻烦。Mybatis-Plus提供我们更方便的方式,通过配置后,可以指定枚举中真正与数据库表中字段值对应的字段,如配置枚举中的value字段为数据库表中字段值。使用方式如下:
1、在枚举对应值字段上标注注解@EnumValue,然后配置文件中开启 枚举扫描
import com.baomidou.mybatisplus.annotation.EnumValue; /** * @Description: 数据库实体删除标记枚举 * @Author: huminghao * @Date: 2019-12-20 **/ public enum DeleteEnum { /** 已删除 */ YES(true, 1, "已删除"), /** 未删除 */ NO(false, 0, "未删除"); private boolean key; @EnumValue private int value; private String name; DeleteEnum(boolean key, int value, String name) { this.key = key; this.value = value; this.name = name; } /** * 获取整型值 * * @return */ public int getIntValue() { return this.value; } }
mybatis-plus.typeEnumsPackage=cn.susoncloud.enums
2、 枚举类实现IEnum接口,然后配置文件开启枚举扫描
实现IEnum接口,并重写getValue()
import com.baomidou.mybatisplus.core.enums.IEnum; /** * @Description: 数据库实体删除标记枚举 * @Author: huminghao * @Date: 2019-12-20 **/ public enum DeleteEnum implements IEnum<Integer>{ /** 已删除 */ YES(true, 1, "已删除"), /** 未删除 */ NO(false, 0, "未删除"); private boolean key; private int value; private String name; DeleteEnum(boolean key, int value, String name) { this.key = key; this.value = value; this.name = name; } /** * 获取整型值 * * @return */ public int getIntValue() { return this.value; } @Override public Integer getValue() { return value; } }
mybatis-plus.typeEnumsPackage=cn.susoncloud.enums
注意,使用了MyBatis-Plus 自定义枚举后,代码中在保存实体时字段值set 枚举即可,get条件查询时,可以枚举也可以value值即可。如下:
实体中枚举字段如
/** * 删除标志(0:正常,1:删除) */ private DeleteEnum deleted;
save、insert、update
new course().setDeleted(DeleteEnum.YES);
select
Map<Property<Course, ?>, Object> queryParam = new LinkedHashMap(); queryParam.put(Course::getId, courseId); queryParam.put(Course::getDeleted, DeleteEnum.NO.getIntValue()); Course course = getOne(new QueryWrapper<Course>().lambda().allEq(queryParam));
Map<Property<Course, ?>, Object> queryParam = new LinkedHashMap(); queryParam.put(Course::getId, courseId); queryParam.put(Course::getDeleted, DeleteEnum.NO); Course course = getOne(new QueryWrapper<Course>().lambda().allEq(queryParam));
Mybatis-Plus在查询时,会在指定查询条件参数时,从枚举中取得注解控制的字段值,或者getValue()的值。
MyBatis-Plus的枚举的使用,并没有改变数据库表字段的类型,数据库表字段仍然使用原先的int或者其他,只是在代码编写层面做了优化,同时保证避免业务代码中误操作错误数据值如插入其他int值(枚举的限制)
发表评论