目录
- 引入问题
- 抛出问题:
- 方式一:
- 方式二:
- 方式三:
- 总结
引入问题
在开发中,经常会使用数据库中一个字段标识这条数据的一种状态。
比如数据库中“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步配置
- 创建枚举类实现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;
};
}
- properties文件里添加配置,定义扫描枚举类的包路径
mybatis-plus.type-enums-package=com.flower.enmus
- 修改实体类字段,本来是Integer类型,改成创建的枚举类名称
private StatusEnum status;
接下里就可以使用了,查询数据库时,只需要StatusEnum .examined而不需要再写getValue()就可以直接使用了,而且在查询操作的时候会直接返回枚举类里定义的“name”值,比如“已审核”、“未审核”、“已拒绝”了,这样页面就可以拿到这个值直接使用了。
总结
每种方式可能都有针对性的场景使用,在需要的场合使用最适当的方式是最适合的。