后端程序员都知道,在Web系统中,分页是一种常见的功能,我之前写的分页方法都比较麻烦,移植性也不高,这就很不乐观了。作为一个积极开朗的程序员,怎么能不去了解PageHelper分页插件呢?PageHelper是国内非常优秀的一款开源的mybatis分页插件,它支持基本主流与常用的数据库,一致支持mysql、oracle、mariaDB、DB2、SQLite、Hsqldb等。OK接下来就一起来了解了解PageHelper分页插件!

@

中文教程

首先,推荐两个PageHelper分页插件项目地址,这里面有中文教程:

github 项目

gitosc 项目

PageHelper使用

至于怎么使用我想上面提供的两个项目讲的绝逼讲的比我清楚,下面直接进入PageHelper使用实战

首先,集成引入分页插件有下面2种方式,一种是直接下jar包一种是mawen依赖,推荐使用 Maven 方式

方法一: 直接下载jar包

jar包下载地址,由于使用了sql 解析工具,你还需要下载 jsqlparser.jar

方法二: Maven添加依赖

  1. <dependency>
  2. <groupId>com.github.pagehelper</groupId>
  3. <artifactId>pagehelper</artifactId>
  4. <version>5.1.2</version>
  5. </dependency>

1.导入maven依赖分页插件

我这里就采用方法二maven依赖

2.各个情况下xml的配置

情况一:如果是mybatis单独使用PageHelper分页插件的时候,就需要在xml配置中添加如下代码:

  1. <!--
  2. plugins在配置文件中的位置必须符合要求,否则会报错,顺序如下properties?, settings?,
  3. typeAliases?, typeHandlers?, objectFactory?,objectWrapperFactory?, plugins?,
  4. environments?, databaseIdProvider?, mappers?
  5. -->
  6. <!-- com.github.pagehelper为PageHelper类所在包名 -->
  7. <plugins>
  8. <!-- 使用下面的方式配置参数,推荐的两个项目中有所有的参数介绍 -->
  9. <plugin interceptor="com.github.pagehelper.PageInterceptor">
  10. <property name="param1" value="value1"/>
  11. </plugin>
  12. </plugins>

情况二:显然,我是这个是ssm项目,mybatis是交由spring的IOC容器管理的,就需要在spring的xml配置中添加如下代码(创建工厂中添加):

  1. <!-- 把交给IOC管理 SqlSessionFactory -->
  2. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  3. <property name="dataSource" ref="dataSource"/>
  4. <!-- 传入PageHelper的插件 -->
  5. <property name="plugins">
  6. <array>
  7. <!-- 传入插件的对象 -->
  8. <bean class="com.github.pagehelper.PageInterceptor">
  9. <property name="properties">
  10. <props>
  11. <prop key="helperDialect">oracle</prop>
  12. <prop key="reasonable">true</prop>
  13. </props>
  14. </property>
  15. </bean>
  16. </array>
  17. </property>
  18. </bean>

下面用一个图来分析一下两个参数作用:



更多情况请参考上面推荐的项目~

3.Controller代码编写

上面我们配置完了,至于为什么从controller代码开始是因为controller调用service嘛,这样编写代码更方便快捷!为了看出差别,未分页的controller代码方法如下:

  1. @Controller
  2. @RequestMapping("/orders")
  3. public class OrdersController {
  4. @Autowired
  5. private IOrdersService ordersService;
  6. //查询所有orders未分页
  7. @RequestMapping("/findAll.do")
  8. public ModelAndView findAll() {
  9. ModelAndView mv = new ModelAndView();
  10. List<Orders> ordersList = ordersService.findAll();
  11. mv.addObject("ordersList", ordersList);
  12. mv.setViewName("orders-list");
  13. return mv;
  14. }
  15. }

而采用了分页代码则是如下:

  1. //采用分页代码方法
  2. @RequestMapping("/findAll.do")
  3. public ModelAndView findAll(@RequestParam(name="page",required = true,defaultValue = "1")int page,@RequestParam(name="size",required = true,defaultValue = "4")int size ) {
  4. ModelAndView mv = new ModelAndView();
  5. List<Orders> ordersList = ordersService.findAll(page,size);
  6. //PageInfo就是一个分页Bean
  7. PageInfo pageInfo =new PageInfo(ordersList);
  8. mv.addObject("pageInfo", pageInfo);
  9. mv.setViewName("orders-list");
  10. return mv;
  11. }

可以发现多了两个参数分别是pagesize

4.Service接口代码编写

  1. public interface IOrdersService {
  2. List<Orders> findAll(int page,int size);
  3. }

5.Service实现类代码编写

在执行sql之前(ServiceImpl),使用PageHelper分页,参数pageNum 是页码值 参数pageSize 代表是每页显示条数。在ServiceImpl中,使用PageHelper分页操作代码如下:

  1. @Service
  2. public class OrdersServiceImpl implements IOrdersService {
  3. @Autowired
  4. private IOrdersDao ordersDao;
  5. @Override
  6. public List<Orders> findAll(int page,int size) {
  7. //参数pageNum 是页码值 参数pageSize 代表是每页显示条数
  8. PageHelper.startPage(page, size);
  9. return ordersDao.findAll();
  10. }
  11. }

特别注意:在编写PageHelper分页代码时的 PageHelper.startPage(page, size)这一句必须写在查询方法的上一句,中间不能添加任何代码,否则失效!

6.jsp页面未处理代码

没有更改的jsp页面代码,普通查询关键更改代码块,注意这里接收数据为 ordersList

  1. <c:forEach items="${ordersList}" var="orders">
  2. <tr>
  3. <td><input name="ids" type="checkbox"></td>
  4. ...
  5. <td>...</td>
  6. </td>
  7. </tr>
  8. </c:forEach>

这下面的代码则是未分页逻辑代码

  1. <div class="box-tools pull-right">
  2. <ul class="pagination">
  3. <li>
  4. <a href="#" aria-label="Previous">首页</a>
  5. </li>
  6. <li><a href="#">上一页</a></li>
  7. <li><a href="#">1</a></li>
  8. <li><a href="#">2</a></li>
  9. <li><a href="#">3</a></li>
  10. <li><a href="#">4</a></li>
  11. <li><a href="#">5</a></li>
  12. <li><a href="#">下一页</a></li>
  13. <li>
  14. <a href="#" aria-label="Next">尾页</a>
  15. </li>
  16. </ul>
  17. </div>
  18. </div>

7.jsp页面处理后代码

更改后的jsp页面代码,分页查询的关键更改代码块,注意这里接收数据为 ordersList.list

  1. <c:forEach items="${ordersList.list}" var="orders">
  2. <tr>
  3. <td><input name="ids" type="checkbox"></td>
  4. ...
  5. <td>...</td>
  6. </td>
  7. </tr>
  8. </c:forEach>

这下面的代码则是分页逻辑代码

  1. <div class="box-tools pull-right">
  2. <ul class="pagination">
  3. <li>
  4. <a href="${pageContext.request.contextPath}/orders/findAll.do?page=1&size=${pageInfo.pageSize}" aria-label="Previous">首页</a>
  5. </li>
  6. <li><a href="${pageContext.request.contextPath}/orders/findAll.do?page=${pageInfo.pageNum-1}&size=${pageInfo.pageSize}">上一页</a></li>
  7. <c:forEach begin="1" end="${pageInfo.pages}" var="pageNum">
  8. <li><a href="${pageContext.request.contextPath}/orders/findAll.do?page=${pageNum}&size=${pageInfo.pageSize}">${pageNum}</a></li>
  9. </c:forEach>
  10. <li><a href="${pageContext.request.contextPath}/orders/findAll.do?page=${pageInfo.pageNum+1}&size=${pageInfo.pageSize}">下一页</a></li>
  11. <li>
  12. <a href="${pageContext.request.contextPath}/orders/findAll.do?page=${pageInfo.pages}&size=${pageInfo.pageSize}" aria-label="Next">尾页</a>
  13. </li>
  14. </ul>
  15. </div>
  16. </div>

8.jsp页面处理前后代码分析



  1. //PageInfo就是一个分页Bean
  2. PageInfo pageInfo =new PageInfo(ordersList);

为了能看到上面的pageInfo源代码,我就把代码贴在下面了

  1. package com.github.pagehelper;
  2. import java.io.Serializable;
  3. import java.util.Collection;
  4. import java.util.List;
  5. public class PageInfo<T> implements Serializable {
  6. private static final long serialVersionUID = 1L;
  7. private int pageNum;
  8. private int pageSize;
  9. private int size;
  10. private int startRow;
  11. private int endRow;
  12. private long total;
  13. private int pages;
  14. private List<T> list;
  15. private int prePage;
  16. private int nextPage;
  17. private boolean isFirstPage;
  18. private boolean isLastPage;
  19. private boolean hasPreviousPage;
  20. private boolean hasNextPage;
  21. private int navigatePages;
  22. private int[] navigatepageNums;
  23. private int navigateFirstPage;
  24. private int navigateLastPage;
  25. public PageInfo() {
  26. this.isFirstPage = false;
  27. this.isLastPage = false;
  28. this.hasPreviousPage = false;
  29. this.hasNextPage = false;
  30. }
  31. public PageInfo(List<T> list) {
  32. this(list, 8);
  33. }
  34. public PageInfo(List<T> list, int navigatePages) {
  35. this.isFirstPage = false;
  36. this.isLastPage = false;
  37. this.hasPreviousPage = false;
  38. this.hasNextPage = false;
  39. if (list instanceof Page) {
  40. Page page = (Page)list;
  41. this.pageNum = page.getPageNum();
  42. this.pageSize = page.getPageSize();
  43. this.pages = page.getPages();
  44. this.list = page;
  45. this.size = page.size();
  46. this.total = page.getTotal();
  47. if (this.size == 0) {
  48. this.startRow = 0;
  49. this.endRow = 0;
  50. } else {
  51. this.startRow = page.getStartRow() + 1;
  52. this.endRow = this.startRow - 1 + this.size;
  53. }
  54. } else if (list instanceof Collection) {
  55. this.pageNum = 1;
  56. this.pageSize = list.size();
  57. this.pages = this.pageSize > 0 ? 1 : 0;
  58. this.list = list;
  59. this.size = list.size();
  60. this.total = (long)list.size();
  61. this.startRow = 0;
  62. this.endRow = list.size() > 0 ? list.size() - 1 : 0;
  63. }
  64. if (list instanceof Collection) {
  65. this.navigatePages = navigatePages;
  66. this.calcNavigatepageNums();
  67. this.calcPage();
  68. this.judgePageBoudary();
  69. }
  70. }
  71. private void calcNavigatepageNums() {
  72. int i;
  73. if (this.pages <= this.navigatePages) {
  74. this.navigatepageNums = new int[this.pages];
  75. for(i = 0; i < this.pages; ++i) {
  76. this.navigatepageNums[i] = i + 1;
  77. }
  78. } else {
  79. this.navigatepageNums = new int[this.navigatePages];
  80. i = this.pageNum - this.navigatePages / 2;
  81. int endNum = this.pageNum + this.navigatePages / 2;
  82. int i;
  83. if (i < 1) {
  84. i = 1;
  85. for(i = 0; i < this.navigatePages; ++i) {
  86. this.navigatepageNums[i] = i++;
  87. }
  88. } else if (endNum > this.pages) {
  89. endNum = this.pages;
  90. for(i = this.navigatePages - 1; i >= 0; --i) {
  91. this.navigatepageNums[i] = endNum--;
  92. }
  93. } else {
  94. for(i = 0; i < this.navigatePages; ++i) {
  95. this.navigatepageNums[i] = i++;
  96. }
  97. }
  98. }
  99. }
  100. private void calcPage() {
  101. if (this.navigatepageNums != null && this.navigatepageNums.length > 0) {
  102. this.navigateFirstPage = this.navigatepageNums[0];
  103. this.navigateLastPage = this.navigatepageNums[this.navigatepageNums.length - 1];
  104. if (this.pageNum > 1) {
  105. this.prePage = this.pageNum - 1;
  106. }
  107. if (this.pageNum < this.pages) {
  108. this.nextPage = this.pageNum + 1;
  109. }
  110. }
  111. }
  112. private void judgePageBoudary() {
  113. this.isFirstPage = this.pageNum == 1;
  114. this.isLastPage = this.pageNum == this.pages || this.pages == 0;
  115. this.hasPreviousPage = this.pageNum > 1;
  116. this.hasNextPage = this.pageNum < this.pages;
  117. }
  118. public int getPageNum() {
  119. return this.pageNum;
  120. }
  121. public void setPageNum(int pageNum) {
  122. this.pageNum = pageNum;
  123. }
  124. public int getPageSize() {
  125. return this.pageSize;
  126. }
  127. public void setPageSize(int pageSize) {
  128. this.pageSize = pageSize;
  129. }
  130. public int getSize() {
  131. return this.size;
  132. }
  133. public void setSize(int size) {
  134. this.size = size;
  135. }
  136. public int getStartRow() {
  137. return this.startRow;
  138. }
  139. public void setStartRow(int startRow) {
  140. this.startRow = startRow;
  141. }
  142. public int getEndRow() {
  143. return this.endRow;
  144. }
  145. public void setEndRow(int endRow) {
  146. this.endRow = endRow;
  147. }
  148. public long getTotal() {
  149. return this.total;
  150. }
  151. public void setTotal(long total) {
  152. this.total = total;
  153. }
  154. public int getPages() {
  155. return this.pages;
  156. }
  157. public void setPages(int pages) {
  158. this.pages = pages;
  159. }
  160. public List<T> getList() {
  161. return this.list;
  162. }
  163. public void setList(List<T> list) {
  164. this.list = list;
  165. }
  166. /** @deprecated */
  167. @Deprecated
  168. public int getFirstPage() {
  169. return this.navigateFirstPage;
  170. }
  171. /** @deprecated */
  172. @Deprecated
  173. public void setFirstPage(int firstPage) {
  174. this.navigateFirstPage = firstPage;
  175. }
  176. public int getPrePage() {
  177. return this.prePage;
  178. }
  179. public void setPrePage(int prePage) {
  180. this.prePage = prePage;
  181. }
  182. public int getNextPage() {
  183. return this.nextPage;
  184. }
  185. public void setNextPage(int nextPage) {
  186. this.nextPage = nextPage;
  187. }
  188. /** @deprecated */
  189. @Deprecated
  190. public int getLastPage() {
  191. return this.navigateLastPage;
  192. }
  193. /** @deprecated */
  194. @Deprecated
  195. public void setLastPage(int lastPage) {
  196. this.navigateLastPage = lastPage;
  197. }
  198. public boolean isIsFirstPage() {
  199. return this.isFirstPage;
  200. }
  201. public void setIsFirstPage(boolean isFirstPage) {
  202. this.isFirstPage = isFirstPage;
  203. }
  204. public boolean isIsLastPage() {
  205. return this.isLastPage;
  206. }
  207. public void setIsLastPage(boolean isLastPage) {
  208. this.isLastPage = isLastPage;
  209. }
  210. public boolean isHasPreviousPage() {
  211. return this.hasPreviousPage;
  212. }
  213. public void setHasPreviousPage(boolean hasPreviousPage) {
  214. this.hasPreviousPage = hasPreviousPage;
  215. }
  216. public boolean isHasNextPage() {
  217. return this.hasNextPage;
  218. }
  219. public void setHasNextPage(boolean hasNextPage) {
  220. this.hasNextPage = hasNextPage;
  221. }
  222. public int getNavigatePages() {
  223. return this.navigatePages;
  224. }
  225. public void setNavigatePages(int navigatePages) {
  226. this.navigatePages = navigatePages;
  227. }
  228. public int[] getNavigatepageNums() {
  229. return this.navigatepageNums;
  230. }
  231. public void setNavigatepageNums(int[] navigatepageNums) {
  232. this.navigatepageNums = navigatepageNums;
  233. }
  234. public int getNavigateFirstPage() {
  235. return this.navigateFirstPage;
  236. }
  237. public int getNavigateLastPage() {
  238. return this.navigateLastPage;
  239. }
  240. public void setNavigateFirstPage(int navigateFirstPage) {
  241. this.navigateFirstPage = navigateFirstPage;
  242. }
  243. public void setNavigateLastPage(int navigateLastPage) {
  244. this.navigateLastPage = navigateLastPage;
  245. }
  246. public String toString() {
  247. StringBuffer sb = new StringBuffer("PageInfo{");
  248. sb.append("pageNum=").append(this.pageNum);
  249. sb.append(", pageSize=").append(this.pageSize);
  250. sb.append(", size=").append(this.size);
  251. sb.append(", startRow=").append(this.startRow);
  252. sb.append(", endRow=").append(this.endRow);
  253. sb.append(", total=").append(this.total);
  254. sb.append(", pages=").append(this.pages);
  255. sb.append(", list=").append(this.list);
  256. sb.append(", prePage=").append(this.prePage);
  257. sb.append(", nextPage=").append(this.nextPage);
  258. sb.append(", isFirstPage=").append(this.isFirstPage);
  259. sb.append(", isLastPage=").append(this.isLastPage);
  260. sb.append(", hasPreviousPage=").append(this.hasPreviousPage);
  261. sb.append(", hasNextPage=").append(this.hasNextPage);
  262. sb.append(", navigatePages=").append(this.navigatePages);
  263. sb.append(", navigateFirstPage=").append(this.navigateFirstPage);
  264. sb.append(", navigateLastPage=").append(this.navigateLastPage);
  265. sb.append(", navigatepageNums=");
  266. if (this.navigatepageNums == null) {
  267. sb.append("null");
  268. } else {
  269. sb.append('[');
  270. for(int i = 0; i < this.navigatepageNums.length; ++i) {
  271. sb.append(i == 0 ? "" : ", ").append(this.navigatepageNums[i]);
  272. }
  273. sb.append(']');
  274. }
  275. sb.append('}');
  276. return sb.toString();
  277. }
  278. }

到这里,基本就OK了,我再次强调我推荐的那两个项目,那里面讲的很详细大佬写的,强调完毕,挥爪~

Mybatis分页插件PageHelper的学习与使用的更多相关文章

  1. Mybatis学习---Mybatis分页插件 - PageHelper

    1. Mybatis分页插件 - PageHelper说明 如果你也在用Mybatis,建议尝试该分页插件,这个一定是最方便使用的分页插件. 该插件目前支持Oracle,Mysql,MariaDB,S ...

  2. MyBatis 分页插件PageHelper 后台报错

    今天遇到一个问题,使用MyBatis 分页插件PageHelper 进行排序分页后,能正常返回正确的结果,但后台却一直在报错 net.sf.jsqlparser.parser.ParseExcepti ...

  3. Mybatis分页插件PageHelper的配置和使用方法

     Mybatis分页插件PageHelper的配置和使用方法 前言 在web开发过程中涉及到表格时,例如dataTable,就会产生分页的需求,通常我们将分页方式分为两种:前端分页和后端分页. 前端分 ...

  4. Mybatis分页插件PageHelper使用

    一. Mybatis分页插件PageHelper使用  1.不使用插件如何分页: 使用mybatis实现: 1)接口: List<Student> selectStudent(Map< ...

  5. Java SSM框架之MyBatis3(三)Mybatis分页插件PageHelper

    引言 对于使用Mybatis时,最头痛的就是写分页,需要先写一个查询count的select语句,然后再写一个真正分页查询的语句,当查询条件多了之后,会发现真不想花双倍的时间写count和select ...

  6. Mybatis分页插件PageHelper的实现

    Mybatis分页插件PageHelper的实现 前言 分页这个概念在做web网站的时候很多都会碰到 说它简单吧 其实也简单 小型的网站,完全可以自己写一个,首先查出数据库总条数,然后按照分页大小分为 ...

  7. 基于Mybatis分页插件PageHelper

    基于Mybatis分页插件PageHelper 1.分页插件使用 1.POM依赖 PageHelper的依赖如下.需要新的版本可以去maven上自行选择 <!-- PageHelper 插件分页 ...

  8. Mybatis分页插件-PageHelper的使用

    转载:http://blog.csdn.net/u012728960/article/details/50791343 Mybatis分页插件-PageHelper的使用 怎样配置mybatis这里就 ...

  9. (转)淘淘商城系列——MyBatis分页插件(PageHelper)的使用以及商品列表展示

    http://blog.csdn.net/yerenyuan_pku/article/details/72774381 上文我们实现了展示后台页面的功能,而本文我们实现的主要功能是展示商品列表,大家要 ...

随机推荐

  1. access 2013下载 access 2010下载 access 2007下载 Access 2003下载 安装交流的论坛

    在网上搜索了一个access 2013下载 access 2010下载 access 2007下载 Access 2003下载 安装交流的论坛 office安装的常见问题: http://www.of ...

  2. Openmp多线程编程练习

    环境配置 一般使用Visual Studio2019来作为openmp的编程环境 调试-->属性-->C/C++-->所有选项-->Openmp支持改为 是(可以使用下拉菜单) ...

  3. 货物移动BAPI:BAPI_GOODSMVT_CREATE报错提示“不能执行功能模块 MB_CREATE_GOODS_MOVEMENT”的原因

    在开发过程中,我们调用BAPI:BAPI_GOODSMVT_CREATE进行货物移动生成物料凭证时,出现了报错提示:“不能执行功能模块 MB_CREATE_GOODS_MOVEMENT”,如下图所示: ...

  4. UiPath之如何打印PDF

    各位小伙伴,大家好,今天写一点基础知识,如何在UiPath中打印PDF. ---小U的QQ群(714733686):小U的订阅号[UiPath8888]--- 当然,我们最希望的就是有一个Activi ...

  5. Opencv python(3)| cv. VideoCapture.get() 参数介绍

    cv2.VideoCapture.get ()  的 (0-18)参数 cv2.VideoCapture.get(0)            视频文件的当前位置(播放)以毫秒为单位 cv2.Video ...

  6. MySQL-配置环境变量及修改密码(附-mysql安装教程)

    MySQL-配置环境变量和修改密码 mysql的安装教程:链接:https://pan.baidu.com/s/1rrPT2X0yRF58kN8jZZx-Mg 密码:55dh 一. 闪退问题 1.1. ...

  7. Okhttp3源码解析

    首先是Okhttp的使用: //缓存文件夹 File cacheFile = new File(getExternalCacheDir().toString(), "cache") ...

  8. hash值生成表后缀(分表方案)

    //businessId分表目标值,tableSize:表数量,tableSuffix:表后缀 public static String getTableSuffix(String businessI ...

  9. Spring Security登录验证流程源码解析

    一.登录认证基于过滤器链 Spring Security的登录验证流程核心就是过滤器链.当一个请求到达时按照过滤器链的顺序依次进行处理,通过所有过滤器链的验证,就可以访问API接口了. SpringS ...

  10. 区块链轻松上手:原理、源码、搭建与应用pdf电子版下载

    区块链轻松上手:原理.源码.搭建与应用pdf电子版下载 链接:https://pan.baidu.com/s/1rKF4U9wq612RMIChs0zv8w提取码:hquz <区块链轻松上手:原 ...