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。
本文来自博客园,作者:帅气的涛啊,转载请注明原文链接:https://www.cnblogs.com/handsometaoa/p/17717317.html