当前位置: 首页 > article >正文

mybatis-plus 前端优雅传参进行排序

痛点

前端页面列表,往往有排序需求,需要传递排序参数给后端,由后端根据参数进行排序,但现有mybatis-plus的分页插件仅支持传递column,为了一个分页参数,还需要单独给前端说传递的表格中列名,就非常不优雅,能不能传递类字段名称呢?

解决方案:自定义分页插件

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;

import net.sf.jsqlparser.schema.Column;
import net.sf.jsqlparser.statement.select.OrderByElement;
public class MyPageInterceptor extends PaginationInnerInterceptor{
    @Override
    protected List<OrderByElement> addOrderByElements(List<OrderItem> orderList, List<OrderByElement> orderByElements) {
        orderByElements = CollectionUtils.isEmpty(orderByElements) ? new ArrayList<>(orderList.size()) : orderByElements;
        List<OrderByElement> orderByElementList = orderList.stream()
            .filter(item -> StringUtils.isNotBlank(item.getColumn()))
            .map(item -> {
                OrderByElement element = new OrderByElement();
                element.setExpression(new Column(camelToUnderscore(item.getColumn())));
                element.setAsc(item.isAsc());
                element.setAscDescPresent(true);
                return element;
            }).collect(Collectors.toList());
        orderByElements.addAll(orderByElementList);
        return orderByElements;
    }

    public MyPageInterceptor(DbType dbType){
        super(dbType);
    }
    public static String camelToUnderscore(String camelCaseStr) {  
        if (camelCaseStr == null || camelCaseStr.isEmpty()) {  
            return camelCaseStr;  
        }  
        StringBuilder result = new StringBuilder();  
        int length = camelCaseStr.length();  
        for (int i = 0; i < length; i++) {  
            char ch = camelCaseStr.charAt(i);  
            if (Character.isUpperCase(ch)) {  
                // 在大写字母前添加下划线,并将大写字母转换为小写  
                if (i != 0) {
                    result.append('_');  
                }  
                result.append(Character.toLowerCase(ch));  
            } else {  
                result.append(ch);  
            }  
        }  
        return result.toString();  
    }  
}

把自定义插件加入拦截器

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.baomidou.mybatisplus.annotation.DbType;

@Configuration
public class MybatisPlusConfig {

  
    // 最新版分页插件
    @Bean
    MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new MyPageInterceptor(DbType.SQL_SERVER2005));
        return interceptor;
    }
    
}

思路

首先继承原来分页插件,覆写原分页插件中的addOrderByElements方法,主要就是对传递进来的column进行camelToUnderscore(驼峰转下划线)处理,这样前端传递类字段即可,传递过来后,由camelToUnderscore把传过来的名称转为下划线格式。这样前端可以任意使用字段进行排序

注意

使用该方式排序需要满足以下条件:

  1. 数据库忽略大小写;
  2. 数据库字段命名使用下滑线;

http://www.kler.cn/news/353951.html

相关文章:

  • 2024年了,视频生成模型离通用世界模拟器还有多大差距?SOTA模型全面评估
  • SpringBoot + minio + kkfile 实现文件预览
  • 【时时三省】(C语言基础)函数介绍strcmp
  • pytorch求hessian
  • 4G模组PSM+超低功耗详解,该选择那种功耗模式?
  • k8s容器启动失败的常见原因及解决办法
  • C++类与对象-继承和多态(超全整理)
  • 【Vue】Vue扫盲(六)关于 Vue 项目运行以及文件关系和关联的详细介绍
  • 安卓流式布局实现记录
  • Redux与Redux-thunk详解
  • Unix Standardization and Implementations
  • 开源节流-2024年10月17日-思维学习笔记
  • 【Kafka】Kafka源码解析之producer过程解读
  • Brave编译指南2024 Linux篇-准备工作(三)
  • “DataOps+大模型”——数造科技在大模型时代的数据开发创新探索
  • 力扣周赛:第419场周赛
  • Redis高阶
  • Vue 的 v-show 和 v-if 区别?
  • 重构长方法之引入参数对象
  • 爬虫实战(黑马论坛)