天天看點

基于Mybatis分頁插件PageHelper實作分頁功能

使用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=;
        if(request.getParameter("pageNum")==null || "".equals(request.getParameter("page"))){
            pageNum=;
        }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(==pageNum){
        alert("親,已經是首頁了");
    }else{
        window.location.href="<%=request.getContextPath()%>/Items/queryAllItems.action?pageNum="+;
    }
}
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插件對于開發效率的提高多麼的有用,很感謝插件的開發者!無限的崇拜以及仰慕!

歡迎大家多多指導!

繼續閱讀