分页是大数据查询必不可少的环节,为提升系统响应速度,提高用户体验,几乎所有的分页都是后端完成。除了使用pageHelper插件之外,这里猫哥总结一下自己是如何实现后端分页的,十分简单易懂。
在实现java后端前,首先了解一下mysql的limit用法。
SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset
LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是 0(而不是 1): 为了与 PostgreSQL 兼容,MySQL 也支持句法: LIMIT # OFFSET #。
例子:mysql> SELECT * FROM table LIMIT 5,10; // 检索记录行 6-15
看到这里,如何进行后端分页是不是已经有谱了?
是的,只要根据前端传回的page(当前页数)和rows(每页数据量),即能计算出select查询时limit的偏移量。最后把偏移量和每页的数量写在SQL进行查询即可。
直接上代码
Controller层
@ResponseBody
@RequestMapping(value = "/read/page", method = RequestMethod.POST, produces = "application/json")
public ResultBean readDeviceputPage(@RequestBody ReadDeviceputPageParamBean bean) {
ResultBean ret = new ResultBean(0);
Long page = bean.getPage();
Long rows = bean.getRows();
page = (null == page) || (page.longValue() <= 0L) ? Long.valueOf(1L) : page;
long startPosition = (page.longValue() - 1L) * rows.longValue() + 1L;
long endPosition = startPosition + rows.longValue() - 1L;
List<VoucherDeviceputBean> list = deviceputMapper.readDeviceputPage(startPosition - 1L, endPosition - startPosition + 1L);
}
Dao层
public interface VoucherDeviceputMapper {
List<VoucherDeviceputBean> readDeviceputPage(@Param("startPosition") long startPosition, @Param("pageSize") long pageSize);
}
XML
<select id="readDeviceputPage" resultType="VoucherDeviceputBean">
SELECT * FROM tb_voucher_deviceput
LIMIT #{startPosition},#{pageSize}
</select>
如上即可完成后端分页(更准确一点:DB分页?)。