使用PageHelper分页插件进行分页

摘要

com.github.pagehelper.PageHelper是一款好用的开源免费的Mybatis第三方物理分页插件。
PageHelper是一款好用的开源免费的Mybatis第三方物理分页插件,其实我并不想加上好用两个字,但是为了表扬插件作者开源免费的崇高精神,我毫不犹豫的加上了好用一词作为赞美。

原本以为分页插件,应该是很简单的,然而PageHelper比我想象的要复杂许多,它做的很强大,也很彻底,强大到使用者可能并不需要这么多功能,彻底到一参可以两用。但是,我认为,作为分页插件,完成物理分页任务是根本,其它的很多智能并不是必要的,保持它够傻够憨,专业术语叫stupid,简单就是美。

我们将简单介绍PageHelper的基本使用和配置参数的含义,重点分析PageHelper作为Mybatis分页插件的实现原理。
PageHelper官方文档

PageHelper的使用

PageHelper中参数介绍

我们主要使用PageInfo类来返回各种信息,下面是参数介绍

public class PageInfo<T> implements Serializable {
private static final long serialVersionUID = 1L;
//当前页
private int pageNum;
//每页的数量
private int pageSize;
//当前页的数量
private int size;
//由于startRow 和endRow 不常用,这里说个具体的用法
//可以在页面中"显示startRow 到endRow 共size 条数据"
//当前页面第一个元素在数据库中的行号
private int startRow;
//当前页面最后一个元素在数据库中的行号
private int endRow;
//总记录数
private long total;
//总页数
private int pages;
//结果集
private List<T> list;
//前一页
private int prePage;
//下一页
private int nextPage;
//是否为第一页
private boolean isFirstPage = false;
//是否为最后一页
private boolean isLastPage = false;
//是否有前一页
private boolean hasPreviousPage = false;
//是否有下一页
private boolean hasNextPage = false;
//导航页码数
private int navigatePages;
//所有导航页号
private int[] navigatepageNums;
//导航条上的第一页
private int navigateFirstPage;
//导航条上的最后一页
private int navigateLastPage;
}

添加Maven依赖

在使用PageHelper时,首先要保证导入的jar包正确与完整

<dependency>
	<groupId>com.github.pagehelper</groupId>
	<artifactId>pagehelper</artifactId>
	<version>5.2.0</version>
</dependency>
<dependency>
	<groupId>com.github.jsqlparser</groupId>
	<artifactId>jsqlparser</artifactId>
	<version>4.3</version>
</dependency>

创建拦截器

特别注意,新版拦截器是 com.github.pagehelper.PageInterceptorcom.github.pagehelper.PageHelper 现在是一个特殊的 dialect 实现类,是分页插件的默认实现类,提供了和以前相同的用法。

1. 在 MyBatis 配置 xml 中配置拦截器插件

<!--
    plugins在配置文件中的位置必须符合要求,否则会报错,顺序如下:
    properties?, settings?,
    typeAliases?, typeHandlers?,
    objectFactory?,objectWrapperFactory?,
    plugins?,
    environments?, databaseIdProvider?, mappers?
-->
<plugins>
    <!-- com.github.pagehelper为PageHelper类所在包名 -->
    <plugin interceptor="com.github.pagehelper.PageInterceptor">
        <!-- 使用下面的方式配置参数,后面会有所有的参数介绍 -->
        <property name="param1" value="value1"/>
	</plugin>
</plugins>

2. 在 Spring 配置文件中配置拦截器插件

使用 spring 的属性配置方式,可以使用 plugins 属性像下面这样配置:

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  <!-- 注意其他配置 -->
  <property name="plugins">
    <array>
      <bean class="com.github.pagehelper.PageInterceptor">
        <property name="properties">
          <!--使用下面的方式配置参数,一行配置一个 -->
          <value>
            params=value1
          </value>
        </property>
      </bean>
    </array>
  </property>
</bean>

构建工具类,方便调用

创建PageUtils类

public PageInfo<Books> pageCreate(int pageNum,int pageSize) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        BookMapper userMapper = (BookMapper) context.getBean("bookMapper");
        PageHelper.startPage(pageNum, pageSize);
        List<Books> list = userMapper.queryAllBook();
        PageInfo<Books> pageInfo = new PageInfo<>(list);

        return pageInfo;
    }

在Controller中进行逻辑处理

//查询全部的书籍并写返回到一个书籍展示页面
    @RequestMapping("/allBook")
    public String list(Model model){
        PageBean<Books> bean = new PageBean<>();
        PageInfo<Books> info = bean.pageCreate(1, 20);
        List<Books> list = info.getList();
        model.addAttribute("list",list);
        model.addAttribute("now",1);
        model.addAttribute("pageTotal",info.getPages());
        return "allBook";
    }

//点击页码跳转
    @RequestMapping("/page")
    public String SelectPage(int value,Model model){
        PageBean<Object> bean = new PageBean<>();
        PageInfo<Books> info = bean.pageCreate(value, 20);
        List<Books> list = info.getList();
        model.addAttribute("pageTotal",info.getPages());
        model.addAttribute("now",value);
        model.addAttribute("list",list);
        model.addAttribute("pageTotal",info.getPages());
        return "allBook";
    }

//点击前进或后退按钮
    @RequestMapping("/next")
    public String next_button(int now,Model model,int button){
        PageBean<Object> bean = new PageBean<>();
        if (button==0) {
            PageInfo<Books> info = bean.pageCreate(now-1, 20);
            List<Books> list = info.getList();
            model.addAttribute("pageTotal", info.getPages());
            model.addAttribute("now", now-1);
            model.addAttribute("list", list);
            model.addAttribute("pageTotal", info.getPages());
        }else if(button==1){
            PageInfo<Books> info = bean.pageCreate(now+1, 20);
            List<Books> list = info.getList();
            model.addAttribute("pageTotal", info.getPages());
            model.addAttribute("now", now+1);
            model.addAttribute("list", list);
            model.addAttribute("pageTotal", info.getPages());
        }
        return "allBook";
    }
posted @ 2022-01-26 16:19  又一岁荣枯  阅读(490)  评论(0编辑  收藏  举报