Mybatis 实现多字段动态排序

背景

在项目的开发过程中,可能会遇到对数据表多个字段进行排序的需求(第一句话就这么难懂😢,不要害怕,万事开头难,结尾更难,开玩笑哒),结合需求轻松易懂。

需求

现在有一张User表

男同学先按 age 字段降序排序,后按 height 字段降序排序,最后按 id 升序排序
女同学先按 age 升序排序,后按 weight 降序排序,最后按 id 升序排序

需求不合理?就说你能不能做,不能做滚蛋。

实现

创建排序对(字段名,排序类型)

@Data
public class SortFieldPair{
    private String fieldName;
    private String sortType;
   
    public SortFieldPair(String fieldName, String sortType) {
        this.fieldName = fieldName;
        this.sortType = sortType;
    }
}

根据策略构建排序对

使用list,排序对才能有序。(eg. 先按身高排序再按体重排序 vs 先按体重排序再按身高排序)

private List<SortFieldPair> buildUserSortList(UserSearchParam userSearchParam) {
    List<SortFieldPair> res = new ArrayList<>();
    if(userSearchParam.getSex == "man") {
        res.add(new SortFieldPair("age", SortOrder.DESC.toString()));
        res.add(new SortFieldPair("height", SortOrder.DESC.toString()));
    } else if(userSearchParam.getSex == "woman") {
        res.add(new SortFieldPair("age", SortOrder.ASC.toString()));
        res.add(new SortFieldPair("weight", SortOrder.DESC.toString()));
    }
    res.add(new SortFieldPair("id", SortOrder.ASC.toString()));
    return res;
}

dao层实现

List<UseroVO> queryListByParam(
    @Param("sortFieldList") List<SortFieldPair> sortFieldPairs,
    @Param("start") int start, 
    @Param("limit") int limit);

mapper层实现

注意使用 ${}#{} 会为表字段加 '' 使变量变为字符串,(eg. name => 'name' ),导致SQL失效。

<select id="queryListByParam" resultType="com.tao.vo.result.UserVO">
    select * FROM sys_user WHERE is_del=0
    <foreach collection="sortFieldList" item="sortField" open="order by " separator="," close=" ">
        ${sortField.fieldName} ${sortField.sortType}
    </foreach>
    LIMIT #{limit} OFFSET #{start}
</select>

最后

对于多字段进行排序,记得在排序字段加索引,当数据库量大的时候没加索引的排序会出现慢SQL。

posted @ 2023-09-20 14:46  帅气的涛啊  阅读(1664)  评论(0编辑  收藏  举报