PageHelper分页插件拼接动态排序语句

简介: PageHelper分页插件拼接动态排序语句

项目中分页使用的是PageHelper分页插件,先看一下配置

pom.xml文件

<!-- pagehelper 分页插件 -->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
        </dependency>

yml文件中

# PageHelper分页插件
pagehelper: 
  helperDialect: mysql
  supportMethodsArguments: true
  params: count=countSql 

业务需求:表格打开,默认按照create_time进行降序排列,然后也可以根据表格的任意一列,进行动态排序,代码如下:

@PostMapping("/list")
  @ResponseBody
  public TableDataInfo list(AreaInfo areaInfo)
  {
    if (areaInfo.getParams().get("orderByColumn") == null){
      ServletUtils.getRequest().setAttribute("orderByColumn","create_time");
    }
    if (areaInfo.getParams().get("isAsc") == null){
      ServletUtils.getRequest().setAttribute("isAsc","desc");
    }
    startPage();
        List<AreaInfo> list = areaInfoService.selectAreaInfoList(areaInfo);
    return getDataTable(list);
  }

startPage()方法

/**
     * 设置请求分页数据
     */
    protected void startPage()
    {
        PageDomain pageDomain = TableSupport.buildPageRequest();
        Integer pageNum = pageDomain.getPageNum();
        Integer pageSize = pageDomain.getPageSize();
        if (StringUtils.isNotNull(pageNum) && StringUtils.isNotNull(pageSize))
        {
            String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy());
            PageHelper.startPage(pageNum, pageSize, orderBy);
        }
    }

TableSupport.buildPageRequest()方法实现

public class TableSupport
{
    /**
     * 封装分页对象
     */
    public static PageDomain getPageDomain()
    {
        PageDomain pageDomain = new PageDomain();
        pageDomain.setPageNum(ServletUtils.getParameterToInt(Constants.PAGE_NUM));
        pageDomain.setPageSize(ServletUtils.getParameterToInt(Constants.PAGE_SIZE));
        pageDomain.setOrderByColumn(ServletUtils.getParameter(Constants.ORDER_BY_COLUMN));
        pageDomain.setIsAsc(ServletUtils.getParameter(Constants.IS_ASC));
        return pageDomain;
    }
    public static PageDomain buildPageRequest()
    {
        return getPageDomain();
    }
}

Constants枚举类部分代码

public class Constants
{
    /**
     * 当前记录起始索引
     */
    public static final String PAGE_NUM = "pageNum";
    /**
     * 每页显示记录数
     */
    public static final String PAGE_SIZE = "pageSize";
    /**
     * 排序列
     */
    public static final String ORDER_BY_COLUMN = "orderByColumn";
    /**
     * 排序的方向 "desc" 或者 "asc".
     */
    public static final String IS_ASC = "isAsc";
}

SqlUtil工具类

public class SqlUtil
{
    /**
     * 仅支持字母、数字、下划线、空格、逗号(支持多个字段排序)
     */
    public static String SQL_PATTERN = "[a-zA-Z0-9_\\ \\,]+";
    /**
     * 检查字符,防止注入绕过
     */
    public static String escapeOrderBySql(String value)
    {
        if (StringUtils.isNotEmpty(value) && !isValidOrderBySql(value))
        {
            return StringUtils.EMPTY;
        }
        return value;
    }
    /**
     * 验证 order by 语法是否符合规范
     */
    public static boolean isValidOrderBySql(String value)
    {
        return value.matches(SQL_PATTERN);
    }
}


相关文章
|
6月前
|
前端开发
bladex中自定义分页的写法~
bladex中自定义分页的写法~
|
SQL Oracle 关系型数据库
什么是分页?如何使用分页?(一)
什么是分页?如何使用分页?
173 0
|
SQL 存储 关系型数据库
什么是分页?如何使用分页?(二)
什么是分页?如何使用分页?
75 0
|
SQL 前端开发
stream排序导致pageHelper分页失效处理
现有一查询会员上课记录的需求,要求按照上课时间进行倒序排列,考虑到后期数据量很多,使用逻辑层进行排序,但是前端小姐姐反应说查询的总记录数不正确.测试库中每页查询20条,实际所有数据总共37条,但是返回的总记录数竟然是20条,说明pageHelper分页失效.
stream排序导致pageHelper分页失效处理
|
数据库
pagehelper分页查询明明下一页没有数据了却还是返回了数据
pagehelper分页查询明明下一页没有数据了却还是返回了数据
499 0
|
XML SQL Java
mybatis学习(23):分页1 多参数传递(索引方式)
mybatis学习(23):分页1 多参数传递(索引方式)
149 0
mybatis学习(23):分页1 多参数传递(索引方式)
|
Java 数据库连接 mybatis
Mybatis的CRUD操作【包含查询记录总条数、模糊查找】(完整代码演示)
Mybatis的CRUD操作【包含查询记录总条数、模糊查找】(完整代码演示)
Mybatis的CRUD操作【包含查询记录总条数、模糊查找】(完整代码演示)
|
Java 数据库连接 mybatis
Mybatis 分页插件 Pagehelper 的 PageInfo 字段属性解释
Mybatis 分页插件 Pagehelper 的 PageInfo 字段属性解释
617 0
|
前端开发
分页重复问题思考
目前项目中存在一个问题,列表会出现数据重复! 原因很容易想到,由于排序原因新添加数据会排在顶部。 勤劳的我们又要开始摸头了 :-)
246 0
|
SQL Java 数据库连接
分页之查询条件保存到 PageBean 的 url 中| 学习笔记
快速学习分页之查询条件保存到 PageBean 的 url 中
172 0