PageHelper插件的简单入门使用步骤

PageHelper的介绍

PageHelper是国内非常优秀的一款开源的mybatis分页插件,它支持基本主流与常用的数据库,例如MySQL、oracle、mariaDB、DB2、SQLite、Hsqldb等。
注意:本次使用方式是基于oracle数据库中操作的。

PageHelper入门使用步骤(总共分为3步)

1.在pom.xml中添加依赖坐标

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>5.1.2</version>
</dependency>

2.在Spring配置文件中配置拦截器插件及其相关参数属性值

<!-- 把交给IOC管理 SqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
    <!-- 配置分页拦截器插件 -->
    <property name="plugins">
        <array>
            <bean  class="com.github.pagehelper.PageInterceptor">
                <property name="properties">
                    <props>
                        <!-- 配置helperDialect属性的作用:用于指定分页插件所使用的数据库 -->
                        <prop key="helperDialect">oracle</prop>
                        <!-- 配置reasonable属性的作用:当该参数设置为 true 时, pageNum<=0 时会查询第一页,
                        pageNum>pages (超过总数时),会查询最后一页。默认false 时,直接根据参数进行查询。 -->
                        <prop key="reasonable">true</prop>
                    </props>
                </property>
            </bean>
        </array>
    </property>
</bean>

这里仅仅只对PageHelper基本使用中的helperDialect、reasonable两个基本功能实现参数做出说明。

3.PageHelper.startPage 静态方法调用

使用方式:在需要进行分页的Mybatis查询方法前调用PageHelper.startPage静态方法,跟在方法后的第一个Mybatis查询方法会被进行分页。

public List<Orders> findAll(int page,int size) {
    // 参数pageNum是页码值, 参数pageSize代表每页显示条数
    PageHelper.startPage(pageNum:page,pageSize:size);
    return ordersDao.findAll();
}

效果展示

PageHelper插件的简单入门使用步骤

PageInfo封装的结果集的简单说明

PageInfo是一个用于封装分页对象的结果集,我们查询的数据可以封装在结果集中,可以方便我们在页面拿到一些分页数据信息。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;

    public PageInfo() {
    }

Controller中将查询的结果集封装在PageInfo对象中:

@RequestMapping("/findAll.do")
public ModelAndView findAll(@RequestParam(name = "page",required = true,defaultValue = "1")int page, @RequestParam(name = "size",required = true,defaultValue = "4")int size) {

    ModelAndView mv = new ModelAndView();

    List<Orders> ordersList = ordersService.findAll(page,size);

    // PageInfo就是一个分页的bean
    PageInfo  pageInfo = new PageInfo(ordersList);

    mv.addObject("pageInfo", pageInfo);
    mv.setViewName("orders-page-list");
    return mv;
}

在页面中取出结果集属性:

<c:forEach items="${pageInfo.list}" var="orders">

   <tr>
      <td><input name="ids" type="checkbox"></td>
      <td>${orders.id }</td>
      <td>${orders.orderNum }</td>
      <td>${orders.product.productName }</td>
      <td>${orders.product.productPrice }</td>
      <td>${orders.orderTimeStr }</td>
      <td class="text-center">${orders.orderStatusStr }</td>
      <td class="text-center">
         <button type="button" class="btn bg-olive btn-xs">订单</button>
         <button type="button" class="btn bg-olive btn-xs" onclick="location.href='${pageContext.request.contextPath}/orders/findById.do?id=${orders.id}'">详情</button>
         <button type="button" class="btn bg-olive btn-xs">编辑</button>
      </td>
   </tr>
</c:forEach>