基于Mybatis分页插件PageHelper实现分页功能

时间:2022-10-12 13:29:14

使用PageHelper插件实现分页功能

分页的功能几乎是所有项目必备的功能,在SSM(spring 、springmvc、mybatis)组织的项目中如何实现分页呢?
下面介绍一种基于mybatis的分页插件PageHelper来帮助我们实现分页的功能。

PageHelper

PageHelper是一款插件,帮助我们在基于mybatis开发的项目中实现分页功能。
关于PageHelper的更多内容以及参考文档,见下面的连接:
PageHelper

1. 项目架构:

spring+springmvc+mybatis
使用的开发工具:eclipse
使用数据库:mysql

2. 引入jar包

使用PageHelper插件实现分页功能,首页需要引入jar包(这一步几应该成为本能反应),你可以从以下地址得到PageHepler的核心jar包
PageHelper核心jar包
另外,由于使用到sql解析,所以还需要sql解析jar包:
jsqlparser jar包
建议选择最新版本

3. 在spring配置文件中配置PageHelper拦截器插件:

<!--配置sqlSessionFactory -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 加载数据源 -->
        <property name="dataSource" ref="dataSource"></property>
        <!-- 加载mybatis全局配置文件 -->
        <property name="configLocation" value="classpath:mybatis/sqlMapperConfig.xml"></property>

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

注意:
PageInterceptor使用plugins的方式配置在sqlSessionFactory bean之下,同时注意在spring配置文件下配置过,就不用再在mybatis配置文件中配置,否则或出现:两个分页插件的错误提示。

4. 修改serviceImpl类,完善查询功能

注意:此处并没有修改mapper.xml文件,只需要在以前的查询基础上增加下面一句话即可:

基于Mybatis分页插件PageHelper实现分页功能

增加红色矩形框中的语句:
pageHelper.startPage(pageNum,pageSize),
其中, pageNum:指的是第几页,pageSize:指的是每一页显示多少条记录
同时需要将之前的返回值可能是List集合或者其他类型,修改为PageInfo类型,为什么要这么做,,其实很好理解,查看pageInfo 的源码:
基于Mybatis分页插件PageHelper实现分页功能
你会发现pageInfo中包含了所有我们想要的信息,我们可以使使用getList()得到结果集,同时我们还可以使用getPages()得到总页数,这个对我们后面的操作相当重要,还要我们可以使用getPageNum()得到当前是第几页,这三个参数都是分页开发中相当重要,也可以说至关重要的数据。我们会惊喜,居然都在pageInfo中,同时也惊叹插件开发者高超的技术!
所以,我们将查询到的list的集合作为参数,初始化生成pageInfo对象。

5. 修改controller类,完善查询

@RequestMapping("queryAllItems.action")
    public ModelAndView list() {
        int pageNum=1;
        if(request.getParameter("pageNum")==null || "".equals(request.getParameter("page"))){
            pageNum=1;
        }else{
            pageNum=Integer.parseInt(request.getParameter("pageNum"));
        }
        System.out.println(pageNum+"====page");
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("itemsList", service.list(pageNum));
        modelAndView.setViewName("/back/showAllItems");

        return modelAndView;
    }

这时候,你可能会明白,为什么我们在serviceImpl类中startPage()方法中参数PageNum是可变的,那些因为我们点击上一下,下一页,首页,尾页时都会传入不同的pageNum值,也就是我们需要根据pageNum第几页的值使得查询动态化。

6. 修改jsp显示页面:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="com.github.pagehelper.PageHelper"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>全部商品</title>
<script type="text/javascript"> function deleteitems(id){ var flag=alert("确定要删除吗?"); if(!flag){ window.location.href="deleteItems.action?id="+id; } } function firstPage(){ var pageNum=document.getElementById("pageNum").value; if(1==pageNum){ alert("亲,已经是首页了"); }else{ window.location.href="<%=request.getContextPath()%>/Items/queryAllItems.action?pageNum="+1; } } function prePage(){ var pageNum=document.getElementById("pageNum").value; pageNum--; window.location.href="<%=request.getContextPath()%>/Items/queryAllItems.action?pageNum="+pageNum; } function nextPage(){ var pageNum=document.getElementById("pageNum").value; pageNum++; window.location.href="<%=request.getContextPath()%>/Items/queryAllItems.action?pageNum="+pageNum; } function lastPage(){ var pageNum=document.getElementById("pageNum").value; var totalPage=document.getElementById("totalPage").value; if(pageNum==totalPage){ alert("亲,已经是尾页了"); }else{ window.location.href="<%=request.getContextPath()%>/Items/queryAllItems.action?pageNum="+totalPage; } } </script>
</head>
<body>
    <a href="additems1.action"> 添加</a>
    <h1 style="width: 100%">----</h1>
    商品列表:
    <table width="100%" border=1>
        <tr>
            <td>商品编号</td>
            <td>商品名称</td>
            <td>商品价格</td>
            <td>生产日期</td>
            <td>商品描述</td>
            <td>操作</td>
        </tr>
        <c:forEach items="${itemsList.getList() }" var="item">
            <tr>
                <td>${item.id}</td>
                <td>${item.name }</td>
                <td>${item.price }</td>
                <td>${item.date }</td>
                <td>${item.detail }</td>
                <td><a href="queryOneItems.action?id=${item.id}">编辑</a> <a  href="javascript:void(0)" onclick="deleteitems(${item.id})">删除</a>
                </td>

            </tr>
        </c:forEach>
    </table>
    <br>
    <div>
        <input type="hidden" id="pageNum" value="${itemsList.getPageNum()}">
        <input type="hidden" id="totalPage" value="${itemsList.getPages()}">
        <span onclick="firstPage()">首页</span> <span onclick="prePage()">上一页</span>
        <span onclick="nextPage()">下一页</span> <span onclick="lastPage()">尾页</span>
    </div>
    <% %>
</body>
</html>

这个时候你会看到,我们的确使用getList()得到结果集,并且每次根据getPageNum()的值,判断当前是不是首页,根据getPages()的值判断当前是不是最后一页,然后使pageNum++或者pageNum–,实现下一页,上一页的跳转。

7. 结果展示:

点击首页和尾页
基于Mybatis分页插件PageHelper实现分页功能
基于Mybatis分页插件PageHelper实现分页功能
控制台输出一下内容:
基于Mybatis分页插件PageHelper实现分页功能
可以看出点击首页和尾页,两次的查询过程

总结

至此我们基本算是完成分页查询的功能,可以看出使用PageHelper插件对于开发效率的提高多么的有用,很感谢插件的开发者!无限的崇拜以及仰慕!

欢迎大家多多指导!

相关文章