目录

  • 引入问题
  • 抛出问题:
  • 方式一:
  • 方式二:
  • 方式三:
  • 总结


引入问题

在开发中,经常会使用数据库中一个字段标识这条数据的一种状态。
比如数据库中“status”字段,为0代表“已审核”,1代表“未审核”,2代表“已拒绝”,在这种情况下,开发的时候我们可能会写静态常量类或者枚举类标识其中的属性,例如:

public static enum ChildrenStatus{
        examined(0, "已审核"),
        examining(1, "未审核"),
        notPassExamining(2, "已拒绝");
        ChildrenStatus(Integer value, String name) {
            this.value = value;
            this.name = name;
        }
        private final Integer value;
        private final String name;
        public Integer getValue() {
            return value;
        }
        public String getName() {
            return name;
        }
    }

当我们需要对数据库操作的时候,可以直接ChildrenStatus.examined.getValue()来用得到“已审核”状态的status值,这样避免了直接在业务代码中写“1”这种魔法值,这是最普遍的做法。

抛出问题:

但是这种方式有一个痛点,就是在查询之后,status字段返回的也是字段值,比如0、1、2,而前端页面展示的需要是“已审核”、“未审核”、“已拒绝”,怎么办呢?

方式一:

可以在前端页面上面转换,比如使用Layui的操作:

{field: 'status', title: '状态 ', align: "center", templet: function (d) {
    if (d.status == 0) {
    	return "已审核";
    }
    if (d.status == 1) {
    	return "<span class=\"layui-btn layui-btn-normal layui-btn-xs\" lay-event=\"verify\">未审核</span>";
    }
    if (d.status == 2) {
		return "<span style=\"color: #f50803;\">已拒绝</span>";
    }
}},

上面的span标签是返回的颜色样式做区分,在这里不做讨论,所以这样的操作的话在写后台页面会加大工作量,而且对接前端人员的时候,也需要在接口文档里把这些字段标识描述清楚,前端才能进行工作。

方式二:

在sql语句中,使用case when关键词,将status字段转换一下,然后再用用VO对象或者Map接收,这样返回给前端的字段就是“已审核”、“未审核”、“已拒绝”这样可以直接显示的字段了,下例只是演示,不是这个业务的真实代码。

select 
    case   job_level
    when     '1'     then    '已审核'
    when   '2'     then    '未审核'
    when   '3'     then    '已拒绝'
    else       'eee' end
    from     dbo.employee

这种做法的话,如果类似的sql查询很多的话,每次都要写相同的语句,一定程度上也加大了数据库的查询时间。

方式三:

MybatisPlus也实现了对该问题的处理,能够让我们在查询数据库时,直接能够返回字段标识的意思,需要3步配置

  1. 创建枚举类实现IEnum
public enum StatusEnum implements IEnum<Integer> {
    examined(0, "已审核"),
    examining(1, "审核中"),
    notPassExamining(2, "未通过审核");
    Status(Integer value, String name) {
        this.value = value;
        this.name = name;
    }
    private final Integer value;
    private final String name;
    @Override
    public Integer getValue() {
        return null;
    }
    public String getName() {
        return name;
    };
}
  1. properties文件里添加配置,定义扫描枚举类的包路径
mybatis-plus.type-enums-package=com.flower.enmus
  1. 修改实体类字段,本来是Integer类型,改成创建的枚举类名称
private StatusEnum status;

接下里就可以使用了,查询数据库时,只需要StatusEnum .examined而不需要再写getValue()就可以直接使用了,而且在查询操作的时候会直接返回枚举类里定义的“name”值,比如“已审核”、“未审核”、“已拒绝”了,这样页面就可以拿到这个值直接使用了。

总结

每种方式可能都有针对性的场景使用,在需要的场合使用最适当的方式是最适合的。