MyBatis(十六)——分页及分页插件pagehelper

x33g5p2x  于2021-09-24 转载在 其他  
字(4.5k)|赞(0)|评价(0)|浏览(652)
前言

mybatis框架分页实现,有几种方式,最简单的就是利用原生的sql关键字limit来实现,还有一种就是利用interceptor来拼接sql,实现和limit一样的功能,再一个就是利用PageHelper来实现。这里以MySQL为例讲解这两种常见的实现方式。

无论哪种实现方式,我们返回的结果,不能再使用List了,需要一个自定义对象Pager:

  1. package com.macay.entity;
  2. import java.util.List;
  3. /** * @ClassName: Pager,分页对象 * @Description: * @Author: Macay * @Date: 2021/9/22 11:58 下午 */
  4. public class Pager<T> {
  5. private int page;//分页起始页
  6. private int size;//每页记录数
  7. private List<T> rows;//返回的记录集合
  8. private long total;//总记录条数
  9. public int getPage() {
  10. return page;
  11. }
  12. public void setPage(int page) {
  13. this.page = page;
  14. }
  15. public int getSize() {
  16. return size;
  17. }
  18. public void setSize(int size) {
  19. this.size = size;
  20. }
  21. public List<T> getRows() {
  22. return rows;
  23. }
  24. public void setRows(List<T> rows) {
  25. this.rows = rows;
  26. }
  27. public long getTotal() {
  28. return total;
  29. }
  30. public void setTotal(long total) {
  31. this.total = total;
  32. }
  33. @Override
  34. public String toString() {
  35. return "Pager{" +
  36. "page=" + page +
  37. ", size=" + size +
  38. ", rows=" + rows +
  39. ", total=" + total +
  40. '}';
  41. }
  42. }
一、使用limit的普通分页

使用limit分页的核心就是SQL,不用任何插件或者工具就能够很方便的实现的方法,我们在mapper文件中拼接这个SQL:

  1. SELECT * from user limit startIndex,pageSize

startIndex:分页的起始位置,从0开始;
pageSize:查询的数量;

接口:

  1. List<Student> getStudentByPage(Map<String, Object> params);
  2. long getCount();

mapper文件:

  1. <select id="getStudentByPage" resultType="com.macay.entity.Student">
  2. select * from student limit #{startIndex}, #{pageSize}
  3. </select>
  4. <select id="getCount" resultType="long">
  5. select count(*) from student
  6. </select>

测试类:

  1. @Test
  2. public void testGetStudentByPage() {
  3. Pager<Student> studnentByPage = getStudnentByPage(2, 5);
  4. System.out.println(studnentByPage);
  5. }
  6. private Pager<Student> getStudnentByPage(int page, int size) {
  7. SqlSession sqlSession = SqlSessionUtils.getSqlSession();
  8. StudentDao mapper = sqlSession.getMapper(StudentDao.class);
  9. Map<String, Object> params = new HashMap<>();
  10. params.put("startIndex", (page-1)*size);
  11. params.put("pageSize", size);
  12. List<Student> students = mapper.getStudentByPage(params);
  13. Pager<Student> studentPager = new Pager<>();
  14. studentPager.setPage(page);
  15. studentPager.setSize(size);
  16. studentPager.setRows(students);
  17. studentPager.setTotal(mapper.getCount());
  18. return studentPager;
  19. }

测试结果如下:

二、使用Mybatis分页拦截器实现

使用Mybatis分页拦截器,我们可以不用在Mapper配置文件中写分页查询语句,我们只需要写非分页查询语句就行,然后通过分页拦截器,拦截到需要分页查询的普通sql,将普通的sql替换成分页sql,非常巧妙的实现分页查询。

这里暂不做深入讲解,具体可以搜索一下网上的讲解:

https://blog.csdn.net/u014292162/article/details/52089808

https://blog.csdn.net/feinifi/article/details/88769101

三、使用分页插件pagehelper

此插件支持的数据库版本很多,如下:

github地址如下:https://github.com/pagehelper/Mybatis-PageHelper

其实PageHelper方法也是第二种使用Interceptor拦截器方式的一种三方实现,它内部帮助我们实现了Interceptor的功能。基本步骤如下:

1、引入maven依赖
  1. <dependency>
  2. <groupId>com.github.pagehelper</groupId>
  3. <artifactId>pagehelper</artifactId>
  4. <version>5.2.0</version>
  5. </dependency>
2、加入 plugin 配置

在 mybatis 核心配置文件中配置 PageHelper 插件(注意target目录):

  1. <!--在<environments>之前加入-->
  2. <plugins>
  3. <plugin interceptor="com.github.pagehelper.PageInterceptor"/>
  4. </plugins>

注意:从4.0.0版本以后已经可以自动识别数据库了,不需要再去指定数据库

3、PageHelper 对象

查询语句之前调用 PageHelper.startPage 静态方法。
在你需要进行分页的 MyBatis 查询方法前调用 PageHelper.startPage 静态方法即可,紧跟
在这个方法后的第一个 MyBatis 查询方法会被进行分页。

接口如下:

  1. List<Student> getStudentByPageHelper();

mapper文件:

  1. <select id="getStudentByPageHelper" resultType="com.macay.entity.Student">
  2. select * from student
  3. </select>

测试类:

  1. @Test
  2. public void getStudentByPageHelper() {
  3. SqlSession sqlSession = SqlSessionUtils.getSqlSession();
  4. StudentDao mapper = sqlSession.getMapper(StudentDao.class);
  5. PageHelper.startPage(2, 5);
  6. List<Student> students = mapper.getStudentByPageHelper();
  7. System.out.println(students);
  8. }

如图所示,查询得到的是第二页的数据,每页5条。

不仅如此,我们还可以获取分页相关的其他参数:

  1. @Test
  2. public void getStudentByPageHelper() {
  3. // 集成分页助手插件,测试分页
  4. SqlSession sqlSession = SqlSessionUtils.getSqlSession();
  5. StudentDao mapper = sqlSession.getMapper(StudentDao.class);
  6. // 设置分页相关参数 当前页+每页显示的条数
  7. PageHelper.startPage(2, 5);
  8. List<Student> students = mapper.getStudentByPageHelper();
  9. // System.out.println(students);
  10. //获取与分页相关的参数
  11. PageInfo<Student> pageInfo = new PageInfo<>(students);
  12. System.out.println("当前页:"+pageInfo.getPageNum());
  13. System.out.println("每页显示条数:"+pageInfo.getPageSize());
  14. System.out.println("总条数:"+pageInfo.getTotal());
  15. System.out.println("总页数:"+pageInfo.getPages());
  16. System.out.println("上一页:"+pageInfo.getPrePage());
  17. System.out.println("下一页:"+pageInfo.getNextPage());
  18. System.out.println("是否是第一页:"+pageInfo.isIsFirstPage());
  19. System.out.println("是否是最后一页:"+pageInfo.isIsLastPage());
  20. }

结果如下:

相关文章