迁移原先公司工作时总结的内容
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值(枚举的限制)
发表评论