欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

MyBatisPlus之实现动态排序方式,

来源: javaer 分享于  点击 49549 次 点评:95

MyBatisPlus之实现动态排序方式,


目录
  • 1、应用场景
  • 2、具体思路
  • 3、具体实现
    • a、排序类
    • b、工具类
    • c、需要排序的VO直接继承Sorter
  • 总结

    1、应用场景

    MyBatis Plus功能很强大,但是对于前端多个排序字段并存且自由度高的场景下,服务端人员很难通过原来的MyBatis Plus功能进行编码,所以有了这个文章。

    2、具体思路

    通过前端传过来的参数对参数进行转驼峰拼接成order Sql 传入排序字段

    • (存在注入风险,自己做好防护)
    • (存在注入风险,自己做好防护)
    • (存在注入风险,自己做好防护)

    3、具体实现

    a、排序类

     
    import io.swagger.annotations.ApiModelProperty;
    import lombok.Data;
     
    /**
     * 1. 基础排序对象,包含排序字段和排序方式
     */
    @Data
    public 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 (StringUtil.isNotEmpty(sortColumn)) {
                // 驼峰命名转为下划线
                sort = StringUtil.toUnderScoreCase(sortColumn);
     
                if (sort.contains(",")) {
                    sortArray = sort.split(",");
                }
            } else {
                return "";
            }
            if (StringUtil.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 (StringUtil.isNotEmpty(statement)) {
                return " order by " + statement;
            } else {
                return statement;
            }
        }
    }

    b、工具类

    (主要驼峰转蛇形,如果项目已经有工具,则修改上面代码)

     
    /**
     * 3. 字符串工具类
     * 4.  5. @author lcl
     */
    public class StringUtil 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();
        }
    }

    c、需要排序的VO直接继承Sorter

    如以下代码

     
    @Data
    @ApiModel("医生搜索参数对象")
    public class SearchDoctorParams extends Sorter{
     
        @ApiModelProperty("搜索关键字")
        private String queryKeyword;
        @ApiModelProperty("科室编号")
        private String departmentNo;
        @ApiModelProperty("医生名称")
        private String doctorName;
        @ApiModelProperty("地区编码")
        private String areaCode;
        @ApiModelProperty("职称编码")
        private String positionCategory;
        @ApiModelProperty("是否有医保编码医生")
        private Boolean withInsuranceCode;
        @ApiModelProperty(value = "三甲名医  1-是 2-否")
        private Integer isFamousDoctor;
        @ApiModelProperty(value = "医生类型(10-全职医生,20-兼职医生)")
        private Integer doctorType;
     
        @ApiModelProperty(value = "医生ids", hidden = true)
        private List<String> doctorIds;
     
     
        @ApiModelProperty(value = "医生特长标签")
        @DisplayDictionary(category = "doctor_specialty_tag")
        private String doctorTag;
     
        String orderStr;
    }
     
    //给orderStr赋值
    record.setOrderStr(Sorter.getOrderByStatement(record));
    //xml层使用
    <choose>
        <when test="params.orderStr != null and params.orderStr != ''">
            ${orderStr}
        </when>
        <otherwise>
            默认排序
        </otherwise>
    </choose>
    //QueryWrapper、LambdaQueryWrapper等直接在最后用last
     
     
    basicDataService.getList(new LambdaQueryWrapper<>().last(Sorter.getOrderByStatement(record)));

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持3672js教程。

    您可能感兴趣的文章:
    • 如何利用反射生成 MyBatisPlus中QueryWrapper动态条件
    • MyBatis-plus数据库字段排序不准确的解决
    • Mybatis-plus如何通过反射实现动态排序不同字段功能
    相关栏目:

    用户点评