分页查询记录总页数

记总记录数:totalNum

每页最大记录数:pageSize


算法一:

pageNum = totalNum % pageSize == 0 ? totalNum / pageSize : totalNum / pageSize + 1 ;


算法二:(推荐)
totalPage = (totalNum + pageSize -1) /pageSize;

其中 pageSize  - 1 就是 totalNum / pageSize 的最大的余数
### MyBatisPlus 分页查询超过页数返回数据的原因分析 当使用 MyBatisPlus 进行分页查询时,如果请求的页面号超出了实际存在的页数范围,默认情况下可能会返回空数据或者部分数据。然而,在某些场景下,即使超出页数也可能返回数据,这通常是由以下几个原因引起的: #### 1. **未启用严格的分页模式** MyBatisPlus 提供了一个 `setOptimizeCountSql` 方法用于优化 SQL 查询中的计数操作[^1]。但如果未开启严格分页模式 (`isStrictMode`),则可能导致在超出页数的情况下仍返回数据。 ```java Page<String> page = new Page<>(pageNo, pageSize); // 设置严格分页模式 page.setSearchCount(true).setOptimizeCountSql(false); ``` #### 2. **SQL 条件过滤的影响** 在分页查询中,如果存在复杂的条件过滤逻辑,则可能影响最终的结果集大小。例如,某些条件下查询结果为空,而其他条件下却有大量数据匹配[^3]。这种差异可能导致分页行为异常。 --- ### 解决方案 针对上述问题,可以采取以下措施来确保分页查询的行为符合预期: #### 方案一:启用严格分页模式 通过设置 `strictMode=true` 参数强制校验当前页码是否合法。如果不合法,则抛出异常或返回空数据。 ```java Page<MyEntity> page = new Page<>(pageNo, pageSize); page.setOptimizeCountSql(false); // 关闭 SQL 计数优化 page.setSearchCount(true); // 开启数统计 myMapper.selectPage(page, null); ``` 此方式能够有效防止越界访问的情况发生。 #### 方案二:自定义拦截器处理边界情况 可以通过实现自定义拦截器的方式捕获非法页码请求,并对其进行特殊处理。例如,当检测到页码超出范围时,直接返回空列表而不执行数据库查询。 ```java @Override public Object intercept(Invocation invocation) throws Throwable { Object[] args = invocation.getArgs(); if (args != null && args.length > 0) { for (Object arg : args) { if (arg instanceof AbstractPage) { AbstractPage<?> page = (AbstractPage<?>) arg; long total = page.getTotal(); // 获取记录数 int current = (int) page.getCurrent();// 当前页码 int size = (int) page.getSize(); // 每页大小 // 判断是否超出最大页数 if ((total / size + (total % size == 0 ? 0 : 1)) < current) { List<Object> emptyList = Collections.emptyList(); page.setRecords(emptyList); // 清空结果集 return page; // 返回空数据 } } } } return invocation.proceed(); } ``` 该方法适用于需要更灵活控制分页逻辑的应用场景[^2]。 #### 方案三:前端输入验证 另一种简单有效的办法是在前端对用户的输入参数进行合法性校验。比如限定可选的最大页码值等于 `(条目数 ÷ 每页显示条目数)` 的向上取整结果[^4]。 --- ### 结 以上三种策略各有优劣,具体选用哪种取决于项目需求和技术栈特点。推荐优先尝试调整框架默认配置(即启用严格分页模式),因为它无需额外编码即可快速解决问题;而对于复杂业务场景,则建议结合自定义拦截器进一步增强系统的健壮性和用户体验。 ```java // 示例代码片段 Page<MyEntity> page = new Page<>(pageNo, pageSize); if (!isValidPage(page)) { // 自定义校验函数 throw new IllegalArgumentException("Invalid page number"); } myMapper.selectPage(page, null); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值