分页查询接口常见设计思路

我们在web开发中,在页面展示时经常会遇到分页技术,常见的分页实现的思路有:

  1. 客户端分页:直接将全部或多页结果数据一次性返回给客户端,客户端通过展现组件进行数据分页的控制。
  2. 数据库分页:进行数据查询时,数据库返回一页数据给客户端。
  3. 服务器分页:从数据库返回全部或者多条数据,在服务器端进行缓存,但是每次只返回一页数据给客户端。

上述思路的优缺点:

  1. 客户端分页
    • 优点:减少了客户端和服务器交互的次数,客户端进行数据缓存,提高了系统交互性。
    • 缺点:增加了第一次交互的负荷
  2. 数据库分页
    • 优点:每次从数据库返回较少数据,当次交互的负荷较轻。
    • 缺点:每次切页时都访问数据库,增加了数据库访问并发性。
  3. 服务器分页(介于1、2之间)

    • 优点:在1、2之间达到了平衡,既减少了数据库并发又使服务器和客户端交互的当次负荷较小
    • 缺点:需要考虑数据缓存、数据同步等问题,增加了系统复杂性。

    根据不同的需求选择合适的分页思路会有事半功倍的效果。

    简单的分页查询接口如下:

    这里写图片描述
    参数说明:
    queryXxxs的两个入参:XxxQueryParam为查询参数对象,PageParam为分页的设置信息,一般包括页码pageNo,每页记录数pageSize和最大查询页数maxPageNum。Page为当前页数据的封装类,其中包括页码pageNo,结果集总页数totalPageNum(客户端分页导航栏需要取到pageNo和totalPageNum)和当前页的业务数据集合pageItems。当需要查询的页码超过结果集最大页数或者超过允许查询的最大页时,抛出OutOfPageSizeException运行期异常。

### 分页查询的实现方法 分页查询是一种常见数据库操作技术,用于将大量数据分成多个页面显示,从而提高用户体验并减少单次请求的数据量。以下是几种常见数据库(如 MySQL、Oracle 和 SQL Server)中的分页查询实现方式。 #### 1. **MySQL 中的分页查询** 在 MySQL 数据库中,`LIMIT` 子句被广泛应用于分页查询。通过指定起始位置和返回记录的数量,可以轻松实现分页功能[^1]。 语法如下: ```sql SELECT * FROM table_name LIMIT offset, count; ``` 其中 `offset` 表示跳过的记录数,`count` 是要获取的记录数量。例如,如果当前页码为 `page`,每页显示的记录数为 `pageSize`,则可以通过以下计算得出偏移量: ```java int offset = (page - 1) * pageSize; ``` #### 2. **Oracle 中的分页查询** Oracle 不支持直接使用 `LIMIT` 关键字,因此通常采用子查询的方式实现分页。一种常用的方法是利用 `ROWNUM` 或者窗口函数 `ROW_NUMBER()` 来限定结果集范围。 基于 `ROWNUM` 的例子: ```sql SELECT * FROM ( SELECT a.*, ROWNUM rn FROM ( SELECT * FROM table_name ORDER BY column_name ) a WHERE ROWNUM <= end_row ) WHERE rn >= start_row; ``` 这里的 `start_row` 和 `end_row` 可以通过 `(page - 1) * pageSize + 1` 和 `page * pageSize` 计算得到。 #### 3. **SQL Server 中的分页查询** 自 SQL Server 2012 起引入了 `OFFSET FETCH` 子句,使得分页更加直观简单。该方法允许开发者明确指定从哪一行开始读取以及需要多少行的结果。 示例代码如下: ```sql SELECT * FROM table_name ORDER BY column_name OFFSET (page - 1) * pageSize ROWS FETCH NEXT pageSize ROWS ONLY; ``` #### 4. **Spring Boot 配合 MyBatis Plus 实现分页查询** 对于现代 Java 开发框架而言,MyBatis Plus 提供了一种便捷的方式来处理复杂的 CRUD 操作,包括分页查询[^4]。只需配置好插件即可自动完成底层 SQL 构建工作。下面是一个典型的控制器层接口定义案例: ```java @GetMapping("/page") public IPage<Order> pageOrders(@RequestParam(defaultValue = "1") int current, @RequestParam(defaultValue = "10") int size){ QueryWrapper<Order> queryWrapper = new QueryWrapper<>(); return orderService.page(new Page<>(current, size), queryWrapper); } ``` 上述代码片段展示了如何接收前端传递过来的参数并通过服务层调用最终获得带有总条目数及当页列表信息的对象实例。 #### 总结 无论是传统关系型数据库还是现代化开发工具链,在实际项目里合理运用这些技巧能够显著提升应用性能表现同时改善交互体验效果。值得注意的是随着业务需求变化可能还需要考虑诸如缓存机制等因素进一步优化整体架构设计思路
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值