DoytoQuery中的分页排序方案示例详解

 更新时间:2022年12月27日 17:12:32   作者:f0rb  
这篇文章主要为大家介绍了DoytoQuery中的分页排序方案示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

引言

分页和排序是数据库提供的两项基本的查询功能。

以MySQL为例,一条典型的SQL查询语句如下:

SELECT * FROM t_user
ORDER BY create_time DESC, username ASC
LIMIT 10 OFFSET 20

那么在前后端交互中,前端应该如何向后端传递分页和排序有关的信息呢?需要传递哪些参数?参数的意义和格式又是什么?

分页

分页的语句为LIMIT 10 OFFSET 20,其中10为每页的大小,20为查询的偏移量,也就是查询表中的第21到30条共计10条数据。

但是在设计接口时,通常不会要求前端直接传入OFFSET参数,而是通过传入页号和分页大小,来计算出OFFSET的值。

在这个例子中,假设前端的页号从1开始,那么需要查询的数据就是分页大小为10的第3页数据,对应的OFFSET的值的计算式为(3-1)*10 = 20

前端在调用后端查询接口时,通常会传入页号和每页大小,由后端计算出OFFSET用于分页查询。这里页号的参数名称定义为pageNumber,分页大小的参数名定义为pageSize, 则以起始页号为1为例,OFFSET的计算公式为:

(pageNumber - 1) * pageSize

而前端的传值应为

?pageNumber=3&pageSize=10

分页接口

不同的数据库的分页语句并不一致,但是一般都需要三个参数:SQL语句,分页大小,偏移量,所以定义一个构建分页语句的接口Dialect,根据访问的数据库提供对应的分页实现。

public interface Dialect {
    String buildPageSql(String sql, int limit, long offset);
}

排序

排序的语句为ORDER BY create_time DESC, username ASC, 其中ORDER BY为SQL的关键字,可以将其定义为参数名。因为是用于排序,所以我将其取名为sort,对应的值为create_time DESC, username ASC。因为前端GET请求需要对参数值里的空格进行转义,为避免这个问题,将值里的,转为;,将DESC/ASC前的空格转为,,最终前端传值如下:

?sort=create_time,desc;username,asc

请求对象

综合以上分页和排序的参数定义和说明,前端的传值如下:

?pageNumber=3&pageSize=10&sort=create_time,desc;username,asc

那么后端就可以定义如下PageQuery类用于分页和排序参数的处理:

public class PageQuery {
    private Integer pageNumber;
    private Integer pageSize;
    private String sort;
}

每条查询都有进行显示或隐式的分页和排序,比如:

SELECT * FROM t_user

SELECT * FROM t_user
ORDER BY id ASC
LIMIT ∞ OFFSET 0

等价

所以PageQuery应当作为所有查询对象的父类,以便为数据查询提供分页和排序的能力。

响应对象

对于前端的分页查询请求,除了返回对应的数据列表外,还需要返回总的数据条数total以帮助前端计算总页数,计算公式为⌈total/size⌉。对应的响应对象定义如下:

public class PageList<T> {
    private final List<T> list;
    private final long total;
}

小结

本篇主要介绍了DoytoQuery中对于数据库查询中分页和排序功能的一种面向对象的解决方案,就这。更多关于DoytoQuery分页排序的资料请关注脚本之家其它相关文章!

相关文章

  • 最全Gson使用

    最全Gson使用

    GSON弥补了JSON的许多不足的地方,在实际应用中更加适用于Java开发,本文主要介绍了最全Gson使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • java设计简单学生管理系统

    java设计简单学生管理系统

    这篇文章主要为大家详细介绍了java设计简单学生管理系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-09-09
  • java List.of()与Arrays.asList()方法对比分析

    java List.of()与Arrays.asList()方法对比分析

    这篇文章主要为大家介绍了java List.of()与Arrays.asList()方法对比分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • Spring boot进行参数校验的方法实例详解

    Spring boot进行参数校验的方法实例详解

    这篇文章主要介绍了Spring boot进行参数校验的方法实例详解,非 常不错,具有参考借鉴价值,需要的朋友参考下吧
    2018-05-05
  • 浅谈Maven环境隔离应用

    浅谈Maven环境隔离应用

    这篇文章主要介绍了浅谈Maven环境隔离应用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-09-09
  • 100行java写的微信跳一跳辅助程序

    100行java写的微信跳一跳辅助程序

    本篇文章给大家分享了用java写的一个微信跳一跳辅助脚本程序,有兴趣的朋友参考学习下。
    2018-01-01
  • Java StringUtils字符串分割转数组的实现

    Java StringUtils字符串分割转数组的实现

    这篇文章主要介绍了Java StringUtils字符串分割转数组的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • 详解java倒计时三种简单实现方式

    详解java倒计时三种简单实现方式

    这篇文章主要介绍了详解java倒计时三种简单实现方式,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • SpringBoot打印启动时异常堆栈信息详解

    SpringBoot打印启动时异常堆栈信息详解

    在本篇文章里小编给大家整理的是关于SpringBoot打印启动时异常堆栈信息,有需要的朋友们可以学习下。
    2019-11-11
  • java 下执行mysql 批量插入的几种方法及用时

    java 下执行mysql 批量插入的几种方法及用时

    java 下执行mysql 批量插入的几种方法及用时,1000次插入方法的比较。
    2013-04-04

最新评论