后台使用枚举类解决条件状态查询

165 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第13天,点击查看活动详情

最近在做项目时看见一个用后台枚举类解决条件状态查询的案例,就是前端页面多个查询条件中含有下拉框,根据下拉框的取值来进行对数据的一个查询,最后将数据返回到页面。之前做一般都是用js控制,但难免会比较繁琐,尤其是对于我们这种更注重后台开发的来说就更不友好了。话不多说,现在给大家分享分享。

先给大家上效果图,当你不对下拉框进行操作或者是你点击请选择的话,就是对整个数据进行一个查询,不管是已删除状态,还是正常状态,

image.png

2.当你选中正常状态时,返回的数据就只有正常状态下的数据,如下图所示:

image.png

3.当你选中注销状态时,返回的数据就只有已删除状态下的数据

那这个功能靠后台到底是怎么实现的呢??? 1.首先,先和大家说一下数据表中有关于删除状态的字段,该表中有一个删除标记字段,该字段中“0”标识正常状态,“1”标识注销状态,删除操作其实就是将该删除标记字段从“0”变成“1”,是逻辑删除,而不是真正的从数据表中进行删除。那么我们就要搞清楚,我们传入的条件以及对应的查询结果,相关该状态查询的mapper.xml文件如下所示:

<select id="selectFaceRecongnitions" resultType="map" parameterType="com.baomidou.mybatisplus.plugins.Page">
        select
        <include refid="Base_Column_List" />
        from tb_face_recognition
        where 1=1
        <if test="userName != null and userName != ''">
            and USER_NAME like CONCAT('%',#{userName},'%')
        </if>
        <if test="isDelete != null ">
            and IS_DELETE = #{isDelete}
        </if>
        <if test="beginTime != null and beginTime != '' and endTime != null and endTime != ''">
            and (CREATE_TIME between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59'))
        </if>
    </select>

2.上面的xml文件中,isDelete是该表中删除状态字段,根据分析我们不难看出,当我们传入的删除状态为“null”时,就是查询所有状态的数据;当我们传入删除状态为“0”时,就是查询正常状态下的数据;当我们传入删除状态为“1”时,就是查询已注销的数据。
那这样一看其实就有想法了,我们可以在页面中搞一个下拉框,设置“正常”状态下的value=0,设置“注销”状态下的value=1,那我们要如何实现选择全部的呢???是直接就在“请选择”状态下设置value=“”吗?

<div class="col-sm-2">
  <#SelectCon id="isDelete" name="状态" >
  <option value="-1" selected="selected">请选择</option>
  <option value="0">正常</option>
  <option value="1">注销</option>
  </#SelectCon>
</div>

3.虽然我们的想法时没错的,是需要传入一个null值,但是把“”这样赋值给value,传入后台的会是一个String类型的空串,而不是说是一个null值,我们应该在之间进行一个转换。
我们可以用一个枚举类,根据前台传进的值来进行类型转化,从而得到我们想要的数据。前台的话,我们可以把“请选择”的value变成“-1”,或者是其它你想变成的值。

<div class="col-sm-2">
  <#SelectCon id="isDelete" name="状态" >
  <option value="-1" selected="selected">请选择</option>
  <option value="0">正常</option>
  <option value="1">注销</option>
  </#SelectCon>
</div>

4.然后在后台控制器中调用一个枚举类的方法对接收的前台数据进行转换:

 @RequestMapping("/list")
 @ResponseBody
 public Object list(@RequestParam(required = false) String userName, @RequestParam(required = false) Integer isDelete, @RequestParam(required = false) String beginTime, @RequestParam(required = false) String endTime) {
        Page<FaceRecognition> page = new PageFactory<FaceRecognition>().defaultPage();
        List<Map<String, Object>> result = faceRecognitionService.selectFaceRecongnitions(page, userName, FaceStatus.valueOf(isDelete),beginTime, endTime);
        page.setRecords(new FaceRecognitionWarpper(result).wrap());
        return new PageInfoBT<>(page);
    }

5.具体枚举类如下:

public enum FaceStatus {

    ALL(-1, null),//全部人脸数据;
    OK(0, 0),//未删除人脸数据;
    DELETE(1, 1);//已删除人脸数据
    
    Integer val;
    Integer message;

    FaceStatus(Integer val, Integer message) {
        this.val = val;
        this.message = message;
    }

    public Integer getMessage() {
        return message;
    }

    public void setMessage(Integer message) {
        this.message = message;
    }

    public Integer getVal() {
        return val;
    }

    public void setVal(Integer val) {
        this.val = val;
    }

    public static Integer valueOf(Integer value) {
        if (value == null) {
            return null;
        } else {
            for (FaceStatus faceStatus : FaceStatus.values()) {
                if (faceStatus.getVal()==(value)) {
                    return faceStatus.getMessage();
                }
            }
            return null;
        }
    }
}



这样,经过枚举类进行类型转换就能轻松的得到我们想要的数据了,你只需要根据自己的需求来定义转换后的数据类型和数据值就可以了。