MyBatis-Plus 实现动态字段排序_当前最新
时间:2023-06-24 02:41:00来源:博客园


(资料图)

场景

虽然前端能根据返回的数组进行对字段的排序,但也仅局限于实现当前页的排序,无法满足全部数据的排序,所以需要走接口的查询进行排序,获取最全的排序数据。

业务需求

思路

  1. 前端需传递排序的字段,该字段是正序还是倒叙。可能存在多个,所以字段为字符串数组,可以通过逗号分开。
  2. 后端拿到参数后,如果字段名是驼峰命名,需要转为小写字母+下划线命名。
  3. 将处理后的字段进行排序sql上的拼接处理后,拼接到 order by 语句后面,得到order by语句。
  4. 根据MyBatis-Plus的 last方法,将处理的order by语句进行拼接到查询sql语句后面。

实现

  1. 前端传递的参数格式为:
{  "sort": "userName,updateTime",  "order": "asc,desc"}
  1. 后端接收排序对象 Sorter,那个请求查询用到自定义排序就继承该类:
import io.swagger.annotations.ApiModelProperty;import lombok.Data;/** 1. 基础排序对象,包含排序字段和排序方式 */@Datapublic class Sorter{    @ApiModelProperty(value = "排序字段",example = "userName")    private String sort;    @ApiModelProperty(value = "排序方式",example = "asc/desc")    private String order;    /**     * 根据查询条件拼接得到order by语句     * @param sorter 分页查询条件     * @return String     */    public static String getStatement(Sorter sorter)    {        String sort;        String[] sortArray = {};        String[] orderArray = {};        String order = sorter.getOrder();        String sortColumn = sorter.getSort();        StringBuilder statement = new StringBuilder();        // 多字段排序        if (StringUtils.isNotEmpty(sortColumn))        {            // 驼峰命名转为下划线            sort = StringUtils.toUnderScoreCase(sortColumn);            if (sort.contains(",")) {                sortArray = sort.split(",");            }        }        else        {            return "";        }        if (StringUtils.isNotEmpty(order))        {            if (order.contains(",")) {                orderArray = order.split(",");            }        }        else        {            return "";        }        if (sortArray.length > 0 && orderArray.length > 0)        {            int length = sortArray.length;            for (int i = 0; i < length; i++) {                statement.append(sortArray[i]);                statement.append(" ");                statement.append(orderArray[i]);                if (i < length - 1 ) {                    statement.append(", ");                }            }        }        else        {            // " #{sort} #{order}“            statement.append(sort);            statement.append(" ");            statement.append(order);        }        return statement.toString();    }    /**     * 根据查询条件拼接得到order by语句     * @param sorter 分页查询条件     * @return String     */    public static String getOrderByStatement(Sorter sorter)    {        String statement = getStatement(sorter);        if (StringUtils.isNotEmpty(statement))        {            return " order by " + statement;        }        else        {            return statement;        }    }}
  1. 处理字段驼峰式的工具类:
/** 3. 字符串工具类 4.  5. @author lcl */public class StringUtils extends org.apache.commons.lang3.StringUtils{    /** 下划线 */    private static final char SEPARATOR = "_";    /**     * * 判断一个字符串是否为非空串     *     * @param str String     * @return true:非空串 false:空串     */    public static boolean isNotEmpty(String str)    {        return !isEmpty(str);    }    /**     * 驼峰转下划线命名     */    public static String toUnderScoreCase(String str)    {        if (str == null)        {            return null;        }        StringBuilder sb = new StringBuilder();        // 前置字符是否大写        boolean preCharIsUpperCase = true;        // 当前字符是否大写        boolean curreCharIsUpperCase = true;        // 下一字符是否大写        boolean nexteCharIsUpperCase = true;        for (int i = 0; i < str.length(); i++)        {            char c = str.charAt(i);            if (i > 0)            {                preCharIsUpperCase = Character.isUpperCase(str.charAt(i - 1));            }            else            {                preCharIsUpperCase = false;            }            curreCharIsUpperCase = Character.isUpperCase(c);            if (i < (str.length() - 1))            {                nexteCharIsUpperCase = Character.isUpperCase(str.charAt(i + 1));            }            if (preCharIsUpperCase && curreCharIsUpperCase && !nexteCharIsUpperCase)            {                sb.append(SEPARATOR);            }            else if ((i != 0 && !preCharIsUpperCase) && curreCharIsUpperCase)            {                sb.append(SEPARATOR);            }            sb.append(Character.toLowerCase(c));        }        return sb.toString();    }}
  1. 请求查询的入参对象继承 Sorter排序对象:
入参对象
  1. Mapper层直接调用last在sql尾拼接语句方法,将SortergetOrderByStatement(Sorter sorter)方法传入:
语句拼接

结果

测试排序

标签:

最新
  • MyBatis-Plus 实现动态字段排序_当前最新

    场景 虽然前端能根据返回的数组进行对字段的排序,但也仅局限于实现

  • “养老顾问”进村居,金山朱泾为老服务让“夕阳”更暖

    近日,金山区朱泾镇老龄办工作人员化身为“Tony老师”,自带装备来到东

  • 世界快资讯:甘肃民族师范学院:地校携手织密校园结核病防控网

    为有效预防传染病在学校的发生和蔓延,确保广大师生的身体健康,创造良

  • 美股异动 | 新能源车股走低 特斯拉(TSLA.US)跌超3%_世界聚看点

    新能源车股走低,截至发稿,特斯拉跌超3%

  • 全国百强市榜单出炉,到底该如何评价呢?

    全国百强市榜单出炉,到底该如何评价呢?,南京,合肥,常州,百强市,华东

  • 金耀街道开展消防隐患大排查 筑牢安全“防火墙”|每日观点

    6月19日晚,为有效预防消防安全事故发生,进一步筑牢辖区消防安全防线

  • 医疗费用报销的程序是怎样的-当前看点

    医疗费用报销的程序是怎样的医疗费用报销的流程:(1)参保人员因病住院

  • 天天微动态丨雷声:中国女花队需要一位“灵魂人物”

    新华社无锡6月21日电(记者王浩宇、王恒志)面对老对手日本队,中国女

  • 佰维存储(688525)6月21日主力资金净卖出1.32亿元|天天微头条

    截至2023年6月21日收盘,佰维存储(688525)报收于88 18元,下跌10 3%,

  • 赤坎区打好用地保障“主动仗”

    6月21日,记者从赤坎区农业农村局获悉,当前,环北部湾广东水资源配置

  • 普京:萨尔马特导弹将进入战斗值勤 基本情况讲解 环球视点

    大家好,今日关于【普京:萨尔马特导弹将进入战斗值勤】迅速上了的热搜

  • 全球热文:如果旗木卡卡西有了双神威万花筒写轮眼,还会被天道佩恩杀死吗?

    和大筒木辉夜战斗的旗木卡卡西其实是在很多增幅下才达到的战力,因为这

  • 洪涛股份控股股东刘年新解除质押3514万股,占总股本2%

    乐居财经吴文婷6月20日,洪涛股份发布公告称,公司近日接到控股股东刘

  • 焦点热文:建筑商的Stego扩展采用波纹铝制成的锯齿状屋顶

    建筑商已经把伦敦南部一座房子的围墙花园变成了一个有锯齿状屋顶的生活

  • 7个渠道!6月23日晚10点可查高考成绩 世界今日讯

    原标题:7个渠道!6月23日晚10点可查高考成绩6月21日,记者从四川省教

  • 工资基数是什么意思啊_工资基数是什么意思 全球时快讯

    1、工资基数可以理解为基本工资,基本工资的构成包括除奖金、加班加点

  • 旅游
    • x8刷机模式(x8刷机)|天天新动态

    • 天天微速讯:悠悠球购买网站_悠悠球网上购买

    • 焦点快看:范丞丞和范冰冰什么关系_范冰冰身价多少亿

    • 15岁初三男生左耳突聋 原因竟是熬夜学习-快播