后端排序优化——谁调用,谁排序

前言

        为了使排序更加灵活,建议后端排序可以优化为“谁调用谁排序”。

代码实现

数据库设计

        以学生表为例。

         前端查询条件为姓名,住址。

Controller

        简化后的controller层代码如下:

/**
     * queryStudent[查询学生]
     * @param name 姓名
     * @param address   住址
     * @param extendSort    排序
     * @param paging    是否分页
     * @param page  第几页
     * @param size  页大小
     * @return java.lang.Object
     */
    @RequestMapping(value = "/query",method={RequestMethod.GET,RequestMethod.POST})
    public  Object queryStudent(
            @RequestParam("name")String name,@RequestParam("address")String address,
            @RequestParam(value = "extendSort", required = false) String extendSort,
            @RequestParam("paging")Boolean paging, @RequestParam("page")Integer page,
            @RequestParam("size")Boolean size
    ) {
        if(paging){
            PageInfo<Student> pageInfo = studentServer.queryStudentPageInfo(name,address,extendSort,page, size);
            return JSON.toJSONString(pageInfo);
        }else{
            return JSON.toJSONString(studentServer.queryStudent(name,address,extendSort));
        }
    }

ServiceImpl

        简化后的serviceImpl层代码如下:

         1.分页查询。

    @Override
    public PageInfo<Student> queryStudentPageInfo(String name,String address,
            String extendSort,Integer page,Integer size) {
        PageHelper.startPage(page, size);
        // 在此定义排序规则,不在sql中定义,因为有的sql没有必要进行排序,比如count(*).谁调用谁排序
        PageHelper.orderBy(stringExtendSort.convertString(extendSort, "a", Student.class));
        // 定义查询的Map
        Map<String,Object> queryMap = new HashMap<>(16);
        queryMap.put("name",name);
        queryMap.put("address",address);
        return new PageInfo<>(studentMapper.queryStudentByMap(queryMap));
    }

        2.不分页查询

/**
     * queryStudent[查询学生,不分页]
     * @param name
     * @param address
     * @param customSort 自定义排序字段
     */
     @Override
     public List<Student> queryStudent(String name,String address,String customSort) {
        // 定义查询的Map
        Map<String,Object> queryMap = new HashMap<>(16);
        queryMap.put("name",name);
        queryMap.put("address",address);
        queryMap.put("customSort",stringExtendSort.convertString(customSort, "a", Student.class));
        return studentMapper.queryStudentByMap(queryMap);
    }

Mapper.xml

<select id="queryStudentByMap" parameterType="java.util.Map" resultMap="Student">
        select a.id,
        a.name,
        a.address,
        a.age
        from test_student a
        <where>
            <if test="id != null">
                and a.id = #{id}
            </if>
            <if test="name != null and name != ''">
                and a.name like CONCAT('%', #{name}, '%')
            </if>
            <if test="address != null and address != ''">
                and a.address like CONCAT('%', #{address}, '%')
            </if>
            <if test="age != null">
                and a.age = #{age}
            </if>
        </where>
        <choose>
            <when test="customSort !=null and customSort != ''">
                order by ${customSort}
            </when>
            <otherwise>
                
            </otherwise>
        </choose>
    </select>

·文中提到的"stringExtendSort"属于保密代码,不便公示,请自行编写。

总结

        其核心思想就是谁调用,谁排序,增加了代码的灵活性和可持续扩展性质。同时也减少了数据库开销。实际开发时,需要的问题往往更加复杂,建议根据实际情况进行扩充。

【2023-07】

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值