阿毛
It's me !
想你所想

MyBatis-Plus之通用枚举的使用

迁移原先公司工作时总结的内容

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值(枚举的限制)

humh

文章作者

站长本人,一个憨批!

发表回复

textsms
account_circle
email

想你所想

MyBatis-Plus之通用枚举的使用
迁移原先公司工作时总结的内容 MyBatis-Plus 提供枚举映射字段的策略,解决了繁琐的配置,让 mybatis 优雅的使用枚举属性! 如我们的数据库中的表中有这样一个字段“`deleted` int(…
扫描二维码继续阅读
2020-06-08