【分页查询】在SSM环境中使用PageHelper
文章目录前言一、导入jar包二、使用步骤三、常用配置order by 啥意思总结前言本文只讨论SSM框架下PageHelper的使用,不讨论SpringBoot提供的starter方式。一、导入jar包<!--pagehelper--><dependency><groupId>com.github.pagehelper</groupId><ar
前言
本文讨论SSM框架下PageHelper的使用,SpringBoot提供的starter方式应该大同小异,用到后会在文章里更新。
一、导入jar包
<!--pagehelper-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.10</version>
</dependency>
二、使用步骤
先给出中文文档:MyBatis 分页插件 PageHelper,如有需要可详细查阅。
下面通过一个小demo介绍如何简单使用PageHelper
三、常用配置
官方文档上有两种配置方式,笔者采用这一种:
在 Spring 配置文件中配置拦截器插件(注:也就是配置数据源的那个地方)
使用 spring 的属性配置方式,可以使用 plugins 属性像下面这样配置:
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 注意其他配置 -->
<property name="plugins">
<array>
<bean class="com.github.pagehelper.PageInterceptor">
<property name="properties">
<!--使用下面的方式配置参数,一行配置一个 -->
<value>
reasonable=true
</value>
</property>
</bean>
</array>
</property>
</bean>
注意上面代码中的 reasonable=true,是可以自己配置的,所有的配置都在官方文档中写的明明白白。
笔者这里只配了reasonable=true。这个属性含义是分页参数合理化,默认值为false, 当该参数设置为 true 时,pageNum<=0 时会查询第一页, pageNum>pages(超过总数时),会查询最后一页。默认false 时,直接根据参数进行查询。
四、小案例演示最简单的分页查询
需求:实现分页查询
前端界面是长这样的每页有2个数据,一共n条数据,分成n/2页来查询。(本例有6条数据,分成3页查询)
而且可以显示出:第几页,共几页,有几个分类
数据库和Dao层的方法
数据库非常简单,就这么几条数据:
而且只用到下面这一个方法,这个方法的作用是把数据库所有东西查出来,并封装到List集合中:
List<Type> queryAllTypes();
Controller层代码:
@GetMapping("/types")
public String toTypes(Model model, @RequestParam(defaultValue = "1",value = "pageNum") Integer pageNum){
/*
PageHelper分页插件: 官方文档: https://pagehelper.github.io/docs/
String orderBy="字段名 排序规律";
PageHelper.startPage(pageNum, pageSize, orderBy);
*/
String orderBy = "id desc";
PageHelper.startPage(pageNum,2,orderBy);
List<Type> list = typeService.queryAllTypes();
//用PageInfo对结果进行包装
PageInfo<Type> pageInfo = new PageInfo<Type>(list);
System.out.println(pageInfo);
model.addAttribute("pageInfo",pageInfo);
return "admin/types";
}
解释一下上面的代码。
-
PageHelper.startPage静态方法是什么?
官方文档给明明白白写着:
-
order by是啥意思?这个参数官方文档并没有写
我上网查到了大神的解决方案。原博客在此
使用它必须满足 Pagehelper的版本需在5.1.2及以上
PageHelper.startPage(pageNum , pageSize);PageHelper.orderBy(“A B”);
其中A为排序依据的字段名,B为排序规律,desc为降序,asc为升序或者一步到位
String orderBy=“字段名 排序规律”;
PageHelper.startPage(pageNum, pageSize, orderBy);
-
PageInfo啥意思?
是对结果集进行封装,这里把结果集封装后传到了html页面,下面讲html页面还会有解释。
HTML页面:
这里采用thymeleaf模板引擎。
<table class="ui compact teal table">
<thead>
<tr align="center">
<th>ID</th>
<th>名称</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<!--
查阅thymeleaf官方文档,并搜索iterStat, 就可知道下面一行的iterStat是啥意思了
https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html
英文官方文档难吗?根本不难.
要对自己的英语水平有自信心.
注意的是 为什么是${pageInfo.list} 而不是直接 ${pageInfo}
非常简单,只需要在后台sout一下pageInfo究竟是个什么东西就知道了:
PageInfo{pageNum=1, pageSize=2, size=2, startRow=1, endRow=2, total=6, pages=3,
list=Page{count=true, pageNum=1, pageSize=2, startRow=0, endRow=2, total=6, pages=3, reasonable=true, pageSizeZero=false}
[Type{id=6, name='Debug专题'}, Type{id=5, name='SpringBoot'}],
prePage=0, nextPage=2, isFirstPage=true, isLastPage=false, hasPreviousPage=false, hasNextPage=true, navigatePages=8,
navigateFirstPage=1, navigateLastPage=3, navigatepageNums=[1, 2, 3]}
分析一下里面, 有一个list字段。这就是为什么必须是${pageInfo.list}的原因了
如果将来pageInfo里面传入的是别的属性, 需要在sout一下pageInfo,并分析出前台需要的是什么.
By the way, 注意一个字段 reasonable=true.
这个字段是不是很眼熟,我们在bean里面配置过了, 它生效了!
-->
<tr align="center" th:each="type,iterStat : ${pageInfo.list}">
<td th:text="${iterStat.count}">1</td>
<td th:text="${type.name}">Java专题</td>
<td>
<a href="#" class="ui mini teal basic button">编辑</a>
<a href="#" class="ui mini red basic button">删除</a>
</td>
</tr>
</tbody>
<tfoot>
<tr>
<th colspan="6" >
<div class="ui inverted divided stackable grid">
<div class="three wide column" align="center">
<!--
理论上讲,我配置了reasonable,这里不需要太多的校验(下同)
这里的 pageInfo. 点出来的这么多属性,从哪来的?
和上面一样, 在后台sout一下pageInfo究竟是个什么东西就知道了.或者直接查阅官方文档,里面就有pageInfo的属性
-->
<a class="item" th:href="@{/admin/types(pageNum=${pageInfo.prePage})}" >上一页</a>
</div>
<div class="ten wide column" align="center">
<!--这里的 pageInfo. 从哪点出来的这么多属性? 上面代码有解释-->
<p>第 <span th:text="${pageInfo.pageNum}"></span> 页,共 <span th:text="${pageInfo.pages}"></span> 页,有 <span th:text="${pageInfo.total}"></span> 个分类</p>
</div>
<div class="three wide column" align="center">
<!--同様,这里因为配置了reasonable,理论上不用担心越界问题,也就用不着校验-->
<a class="item" th:href="@{/admin/types(pageNum=${pageInfo.nextPage})}">下一页</a>
</div>
</div>
<div align="center">
<a href="#" th:href="@{/admin/typesinput}">
<button type="button" class="ui teal button m-mobile-wide m-margin-top"><i class="pencil icon"></i>新增</button>
</a>
</div>
</th>
</tr>
</tfoot>
</table>
观察上面的代码,上面的代码其实就是展示出了本文开头需求的前端页面。有两点需要说一下:
- PageInfo这个属性从Controller传到了前端,这玩意到底是啥意思?
查阅官方文档,或者自己在后台systemout一下,就能看出来 pageInfo究竟是个什么东西。
懒人们可以直接看下图,下图就是官方解释:2. 还记得之前配置的reasonable=true这个属性吗?
这个属性配置之后能大大简化前端的代码。如果不配置的话,前端的判断校验是这么写的:
简而言之就是需要去判断有没有上一页?页码小于零咋办?如果没有下一页如何跳转?等等这些问题。一旦我们配置了reasonable,就全都解决了,一行代码就可以解决,根本不用操心上面的逻辑:<a class="item" th:href="@{/admin/types(pageNum=${pageInfo.hasPreviousPage}?${pageInfo.prePage}:1)}" th:unless="${pageInfo.isFirstPage}">上一页</a>
<!--配置完reasonable之后,根本不用校验--> <a class="item" th:href="@{/admin/types(pageNum=${pageInfo.prePage})}" >上一页</a>
总结
PageHelper真是一个非常好用的东西,如果有不会的地方,一定要看官方文档,写的通俗易懂。而且一共就一点内容,就算全看完也不用多少时间,别怕。
更多推荐
所有评论(0)