写点什么

开源一夏 | 查询分页不只有 limit,这四种分页方法值得掌握

作者:知识浅谈
  • 2022 年 8 月 04 日
  • 本文字数:1654 字

    阅读完需:约 5 分钟

开源一夏 | 查询分页不只有limit,这四种分页方法值得掌握

🍁 作者:知识浅谈,CSDN 签约讲师,后端领域优质创作者,阿里云社区技术博主,热爱分享创作💒 公众号:知识浅谈

📌 擅长领域:全栈工程师、爬虫、ACM 算法

🔥 联系方式 vx:zsqtcc


分页的出现⛳⛳⛳


  1. 由于前端在页面显示数据时,希望每个页面只显示指定条数的数据,由于数据量较大,不能够一次性展示,所以就通过限制每个页面固定的条数进行展示。

  2. 如果数据量较大的话,页面也不一定加载完全,所以造成效率比较差,所以解决方案分页查询就可以很好的解决这个问题了,通过把庞大的数据按照固定的数目显示,在通过上一页或下一页的按钮显示其它的数据。


🤞Mybatis 常用四种分页方法总结🤞

🎈limit 的传统方式

📐最常用的 mysql 分页是使用 limit,limit 子句可以被用于强制 select 语句返回指定范围和大小的记录数。limit 接受一个或两个数字参数。参数必须是一个整数常量。


  • 如果是一个参数,如 limit 10,则表示默认从开始位置开始获取 10 条数据。

  • 如果是两个参数,第一个参数指定的是返回行数的开始位置,第二个参数指定的是返回记录行的数目。Eg: select * from user limit 0,10 表示从第 0 个位置开始获取 10 条数据。

🎈PageHelper 插件的方式

这个的使用方法是在查询数据之前设置一个 pageHelper,当进行查询的时候会对查询语句进行拦截,然后在对应的查询语句上添加 limit a,b 这个分页的语句。


👀使用方法如下:


  1. 引入依赖


          <!-- pagehelper -->          <dependency>              <groupId>com.github.pagehelper</groupId>              <artifactId>pagehelper-spring-boot-starter</artifactId>              <version>${pagehelper.version}</version>          </dependency>
复制代码


  1. 使用代码注意 PageHelper.startPage(pageNo, pageSize)


          PageResult<List<Employee>> result = new PageResult<>();          //就是下边的这个地方,使用了  pageNo是offset就是开始位置的偏移量,第二个参数pageSize是查询返回的数据的条数          PageHelper.startPage(pageNo, pageSize);          try {              List<Employee> employeeList = employeeService.findAll();              PageInfo<Employee> pageInfo = new PageInfo<>(employeeList);              log.info(String.valueOf(employeeList));              result.setTotal(pageInfo.getTotal());              result.setPages(pageInfo.getPages());              result.setCurrent(pageInfo.getPageNum());              result.setSize(pageInfo.getPageSize());              result.setResult(employeeList);              result.success("查询成功!");
}
复制代码


  1. 查询结果

🎈自定义 Interceptor 的方式

类似于 PageHelper,只不过这个是需要自己写 Interceptor 拦截器的,对于相应的查询进行。有人可能会说:有了 PageHelper,为什么还要自定义 Inteceptor?


使用分页插件的时候再 dao 层使用了 @Param 注解导致了分页失效


像是上边的这种情况,我们只能自定拦截器拦截对应的查询语句得到正确的结果。

🎈RowsBounds 方式

📐相比上边的三中方法是物理分页,这个 RowsBounds 是逻辑分页,之所以这么说是因为这个是把所有数据查出来之后,然后再取出对应位置的记录。


📐RowBounds 中有 2 个参数 offset 和 limit。使用这种方式获取所有的 ResultSet,从 ResultSet 中的 offset 位置开始获取 limit 个记录。但这并不意味着 JDBC 驱动器会将所有的 ResultSet 存放在内存,实际上只加载小部分数据到内存,如果需要,再加载部分数据到内存


代码:


service层:
RowBounds rowbounds = new RowBounds(offset, Integer.parseInt(pageSize));//用户数据集合List<Map<String, Object>> userList = userDao.queryUserList(rowbounds);
Dao层:public List<Map<String, Object>> queryUserList(RowBounds rowbounds);
mapperxml层:<!-- 查询用户列表 --> <select id="queryUserList" resultType="java.util.Map"> select * from user </select>
复制代码

🍚总结

总的四种方法,前三种属于物理分页,最后一种属于逻辑分页。

发布于: 刚刚阅读数: 4
用户头像

知识浅谈

关注

公众号:知识浅谈 2022.06.22 加入

🍁 作者:知识浅谈,CSDN签约讲师,后端领域优质创作者,阿里云社区技术博主,热爱分享创作 💒 公众号:知识浅谈 📌 擅长领域:全栈工程师、爬虫、ACM算法 🔥 联系方式vx:zsqtcc

评论

发布
暂无评论
开源一夏 | 查询分页不只有limit,这四种分页方法值得掌握_开源_知识浅谈_InfoQ写作社区