PageHelper分頁外掛的原理及其使用
阿新 • • 發佈:2019-02-20
PageHelper分頁外掛原理
PageHelper本身是一個物理分頁外掛,實際原理就是修改最後的執行sql,增加相應的分頁內容,是基於攔截器實現的。
例如,首先你配置了PageHelper的Pagenum和Pagesize屬性,呼叫完startPage後,他會通過PageInterceptor對其後的第一個執行sql進行攔截,也就是對List<User> list = userService.findAllUser()進行攔截,這裡原本的sql可能是 select * from users,他會自動拼接上分頁的sql語句,比如mysql環境的話,就是拼接上limit語句,隨後執行,最後的結果,可以通過PageInfo和Page進行獲取。
pom.xml檔案新增依賴
<!-- mybatis分頁依賴start============= --> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.1.2</version> </dependency> <!-- mybatis分頁依賴end============= -->
spring-mybatis.xml 檔案關於整合mybatis的配置(分頁外掛有標註)
<!--整合mybatis --> <!-- 1 注入一股mybatis的sqlsessionFactory這就是我們所要做的關鍵步驟 2 宣告式的事務管理 --> <bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <!-- 引入mappers檔案 --> <!-- <property name="configLocation" value="classpath:mybatis-config.xml"></property> --> <!-- 這就要求所有的mapper檔案必須在com/sz/mapper/之下 --> <property name="mapperLocations" value="classpath:com/sz/mapper/**/*.xml" /> <property name="configuration"> <bean class="org.apache.ibatis.session.Configuration"> <!-- 可以加入駝峰命名,其它mybatis的配置也就是mybatis.cfg.xml的相關配置都會轉移到這裡來 user_name userName --> <property name="mapUnderscoreToCamelCase" value="true" /> </bean> </property> <!-- 外掛配置 --> <property name="plugins"> <array> <!-- 分頁外掛的配置 攔截器實現分頁功能 --> <bean class="com.github.pagehelper.PageInterceptor"> <!-- 分頁外掛的配置 攔截器實現分頁功能 --> <!-- 這裡的幾個配置主要演示如何使用,如果不理解,一定要去掉下面的配置 --> <property name="properties"> <value> helperDialect=mysql reasonable=true supportMethodsArguments=true params=count=countSql autoRuntimeDialect=true </value> </property> </bean> </array> </property> </bean>
頁面程式碼 main.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>商品資訊管理系統</title>
<link rel="stylesheet" href="${ctx}/static/plugins/layui/css/layui.css">
</head>
<body>
<form>
<table class="layui-table">
<thead>
<tr>
<th >商品編號</th>
<th width="30px;">商品名稱</th>
<th>商品價格(單位)</th>
<th>庫存數量</th>
<th>訂單狀態</th>
<th>商品區域(1.朝陽2.海淀3.豐臺4.西城5.昌平)</th>
<th>建立時間</th>
<th>操作</th> <th>操作</th> <th>操作</th>
<%--<th>操作</th>--%>
</tr>
</thead>
<%-- 三大排序要求 數量的降序,日期的升序,價格降序 --%>
<tbody>
<c:forEach items="${page.list}" var="ob">
<tr>
<td>${ob.id}</td>
<td width="30px;">${ob.goodsName}</td>
<td>
${ob.goodsPrice}
</td>
<td>${ob.goodsCount}</td>
<td>${ob.billStatus}</td>
<td>${ob.goodsDistrict}</td>
<td>${ob.creationTime}</td>
<%-- 根據id查詢返回 修改頁面--%>
<td><a href="${ctx}/good/query/by/${ob.id}">修改</a></td>
<td><a href="${ctx}/good/delete/${ob.id}">刪除</a></td>
<td><a href="${ctx}/jsp/add.jsp">新增</a></td>
</tr>
</c:forEach>
<tr>
<td> 共${page.total} 條記錄 第 ${page.pageNum} / ${page.pages}頁</td>
<td colspan="8"> <a href="${ctx}/good/pageTo/${page.pageNum=1}">首頁</a>
<a href="${ctx}/good/pageTo/${page.pageNum-1}">上一頁</a>
<a href="${ctx}/good/pageTo/${page.pageNum+1}">下一頁</a>
<a href="${ctx}/good/pageTo/${page.pages}">尾頁</a>
</td>
</tr>
</tbody>
</table>
<a href="${ctx}/good/select">點選另一個查詢頁面</a>
<p> <a href="${ctx}/good/page"> 返回商品詳情首頁</a></p>
</form>
<%-- 匯入前端框架--%>
<script src="${ctx}/static/plugins/layui/layui.js"></script>
<script>
$(function () {
alert(${ob.id});
})
</script>
</body>
</html>
介面 GoodsService.java
package com.sz.service;
import com.github.pagehelper.PageInfo;
import com.sz.pojo.Goods;
import java.util.List;
public interface GoodsService {
// 提供分頁外掛的查詢
PageInfo<Goods> queryByPage(PageInfo pageInfo);
}
實現類 GoodsServiceImpl
package com.sz.service.impl;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.sz.mapper.GoodsMapper;
import com.sz.pojo.Goods;
import com.sz.service.GoodsService;
import constant.CommonCodeConstant;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service("goodsService")
public class GoodsServiceImpl implements GoodsService {
@Autowired
private GoodsMapper goodsMapper;
@Override
public PageInfo<Goods> queryByPage(PageInfo pageInfo) {
// 去第幾頁, 頁碼的大小
PageHelper.startPage(pageInfo.getPageNum(),pageInfo.getPageSize());
List<Goods> lo = goodsMapper.queryAll();
PageInfo<Goods> page = new PageInfo<Goods>(lo);
return page;
}
}
控制器程式碼GoodsController
package com.sz.controller;
import com.github.pagehelper.PageInfo;
import com.sz.pojo.Goods;
import com.sz.service.GoodsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.Date;
import java.util.List;
@Controller
@RequestMapping("/good")
public class GoodsController {
@Autowired
private GoodsService goodsService;
// 查詢商品詳情並帶有分頁引數
@RequestMapping("/page")
public String queryByPage(Model model) {
PageInfo<Goods> pageInfo = new PageInfo<>();
pageInfo.setPageSize(3); //每頁的數量
pageInfo.setPageNum(1);//當前頁
pageInfo = goodsService.queryByPage(pageInfo);
model.addAttribute("page", pageInfo);
return "main";
}
// 跳轉分頁頁面
@RequestMapping("/pageTo/{page}")
public String pageInfo(@PathVariable("page") Integer page, Model model) {
// 上一頁到頂時
if (page < 1) {
page = 1;
}
PageInfo<Goods> pageInfo = new PageInfo<>();
pageInfo.setPageSize(3); //每頁的數量
pageInfo.setPageNum(page);//當前頁
pageInfo = goodsService.queryByPage(pageInfo);
model.addAttribute("page", pageInfo);
return "main";
}
}
關鍵要素:
通過 pageInfo.setPageSize(int);設定每頁顯示的數量
pageInfo.setPageNum(page);設定當前所在的頁數
希望通過簡潔有效的方式實現分頁效果