1. PageHelper
1.1 PageHelper 是什么
PageHelper:MyBatis 的一个分页插件。
1.2 Maven 依赖
PageHelper 的实现依赖自 com.github.pagehelper
PageHelper on GitHub : PageHelper
Spring:
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.2.0</version>
</dependency>
Spring Boot :
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.4.0</version>
</dependency>
1.3 PageHelper 配置
使用 PageHelper 时,我们常常需要单独配置它的属性,在 Spring Boot 与 Spring 中配置方法有所不同。
🔻 Using in mybatis-config.xml
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<!-- config params as the following -->
<property name="param1" value="value1"/>
</plugin>
</plugins>
🔻 Using in Spring application.xml
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- other configuration -->
<property name="plugins">
<array>
<bean class="com.github.pagehelper.PageInterceptor">
<property name="properties">
<!-- config params as the following -->
<value>
param1=value1
</value>
</property>
</bean>
</array>
</property>
</bean>
🔻 Using in Spring Boot application.yml
pagehelper:
param1: value1
param2: value2
...
1.4 PageHelper 属性
PageHelper 为我们提供了许多可配置的属性,具体配置时根据环境的不同选择上方的配置方法。
配置的属性类实现自 Dialect 接口,想要自定义属性可以实现该接口!PageHelper 类也是是实现了该接口。
🔻 常用属性:
-
helperDialect:配置数据库类型,由此自动选择合适的分页方式。
- Options:
oracle
、mysql
、db2
、sqlserver
…
- Options:
-
reasonable:分页合理化参数,默认值为
false
- false:直接根据参数进行查询
- true:
pageNum<=0
时会查询第一页,pageNum>pages
(总页数),会查询最后一页
-
params:为了支持
startPage(Object params)
方法,增加了该参数来配置参数映射,用于从对象中根据属性名取值- Options:
pageNum
、pageSize
、count
、pageSizeZero
、reasonable
- Default:
pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero
- Options:
-
supportMethodsArguments:支持通过 Mapper 接口参数来传递分页参数,默认值
false
,分页插件会从查询方法的参数值中,自动根据params
配置的字段中取值,查找到合适的值时就会自动分页 -
pageSizeZero:默认值为
false
- true:如果
pageSize=0
或者RowBounds.limit = 0
就会查询出全部的结果
- true:如果
🔻 其他属性:
- offsetAsPageNum:默认值为
false
,该参数对使用RowBounds
作为分页参数时有效- true:会将
RowBounds
中的offset
参数当成pageNum
使用,可以用页码和页面大小两个参数进行分页
- true:会将
- rowBoundsWithCount:默认值为
false
,该参数对使用RowBounds
作为分页参数时有效。- true:使用
RowBounds
分页会进行 count 查询
- true:使用
- autoRuntimeDialect:默认值为
false
- true:允许在运行时根据多数据源自动识别对应方言的分页
- closeConn:默认值为
true
- true:当使用运行时动态数据源或没有设置
helperDialect
属性自动获取数据库类型时,会自动获取一个数据库连接, 通过该属性来设置是否关闭获取的这个连接 - false:不会关闭获取的连接,这个参数的设置要根据自己选择的数据源来决定。
- true:当使用运行时动态数据源或没有设置
2. Spring 中使用
下面将在SSM框架中使用 PageHelper!
IDEA:2021.2
Tomcat:8.5.39
Maven:3.8.2
PageHelper:5.2.0
依赖:
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.2.0</version>
</dependency>
2.1 配置属性
在 Spring 的配置文件中配置属性。
ApplicationContext.xml
<!-- 配置sqlSessionFactoryBean-->
<bean class="org.mybatis.spring.SqlSessionFactoryBean" id="sqlSessionFactory">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<property name="mapperLocations" value="classpath*:com/Mapper/*.xml"/>
<!-- 分页插件 -->
<property name="plugins">
<array>
<bean class="com.github.pagehelper.PageInterceptor">
<property name="properties">
<props>
<!-- 设置使用的是那个数据库-->
<prop key="helpDialect">mysql</prop>
<!--设置可以默认可以处理页面异常 -->
<prop key="reasonable">true</prop>
</props>
</property>
</bean>
</array>
</property>
</bean>
2.2 Service
我们不需要修改Mapper中的东西,但需要保证我们已经有了全查的方法。
在 Service 接口中添加一个抽象方法:
PageInfo<User> queryList(Integer pageNum, Integer pageSize);
pageNum:分页后的页数
pageSize:每页数据记录的条数
PageInfo 中还有很多的参数,就不一一举例了!
2.3 ServiceImpl
在 Service 的实现类中,实现上面写的抽象方法:
public PageInfo<User> queryList(Integer pageNum, Integer pageSize) {
// 如果使用分页,先调用startPage
PageHelper.startPage(pageNum,pageSize);
// 调取Mapper的getAllUser方法,查询所有数据
List<User> allUser = userMapper.getAllUser();
// 将所有数据放入到分页类中
PageInfo<User> userPageInfo = new PageInfo<>(allUser, pageSize);
return userPageInfo;
}
2.4 Controller
@RequestMapping("/getAllUser")
public String getAllUser(Model model, HttpServletRequest request){
// 获取页面传入的页面编号,若值为空则赋1,否则将获取页面编号赋给pageNum
int pageNum = request.getParameter("pageNum")==null ? 1 : Integer.valueOf( request.getParameter("pageNum"));
// 每页显示几条数据
int pageSize = 3;
// 存放当前页显示的信息
PageInfo<User> pageInfo = userService.queryList(pageNum, pageSize);
// 当前的总页数
model.addAttribute("pages",pageInfo.getPages());
// 获取当前页码
model.addAttribute("pageNum",pageInfo.getPageNum());
// 获取前端页面显示的数量
model.addAttribute("pageSize",pageInfo.getPageSize());
model.addAttribute("userList",pageInfo.getList());
return "userlist";
}
2.5 JSP
JSP中添加如下div(应该能看懂吧):
<div>
<span>共${pages}页</span>
<span>当前第${pageNum}页</span>
<span>
<a href="${pageContext.request.contextPath}/getAllUser?pageNum=1">首页</a>
</span>
<span>
<c:if test="${pageNum!=1}">
<a href="${pageContext.request.contextPath}/getAllUser?pageNum=${pageNum-1}">|上一页</a>
</c:if>
</span>
|
<span>
<c:if test="${pageNum<pages}">
<a href="${pageContext.request.contextPath}/getAllUser?pageNum=${pageNum+1}">下一页|</a>
</c:if>
</span>
<span>
<a href="${pageContext.request.contextPath}/getAllUser?pageNum=${pages}">尾页</a>
</span>
</div>
2.6 测试
3. Spring Boot 中使用
依赖:
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.4.0</version>
</dependency>
3.1 配置属性
在 Spring Boot 的配置文件中配置属性。
application.yml
pagehelper:
helper-dialect: mysql
reasonable: true
support-methods-arguments: true
page-size-zero: true
3.2 Service
PageInfo<Employee> queryList(Integer pageNum, Integer pageSize);
3.3 ServiceImpl
@Override
public PageInfo<Employee> queryList(Integer pageNum, Integer pageSize) {
// 如果要使用分页,先调用startPage方法
PageHelper.startPage(pageNum, pageSize);
// 查询所有数据
List<Employee> all = getAll();
// 将所有的数据存放至分页的类中
PageInfo<Employee> pageInfo = new PageInfo<>(all, pageSize);
return pageInfo;
}
3.4 Controller
@RequestMapping("/emps")
public String list(Model model, HttpServletRequest request) {
int pageNum = request.getParameter("pageNum")==null ? 1 : Integer.valueOf( request.getParameter("pageNum"));
int pageSize = 3;
PageInfo<Employee> pageInfo = employeeService.queryList(pageNum, pageSize);
model.addAttribute("pages",pageInfo.getPages());
model.addAttribute("pageNum",pageInfo.getPageNum());
model.addAttribute("pageSize",pageInfo.getPageSize());
model.addAttribute("employees",pageInfo.getList());
return "list";
}
3.5 HTML
<div>
<span th:text="'共' + ${pages} + '页'"></span>
<span th:text="'当前第' + ${pageNum} + '页'"></span>
<a th:href="@{/emps(pageNum=1)}">首页</a>
<span th:if="${pageNum}!=1">
<a th:href="@{/emps(pageNum=${pageNum}-1)}">|上一页</a>
</span>
|
<span th:if="${pageNum} < ${pages}">
<a th:href="@{/emps(pageNum=${pageNum}+1)}">下一页|</a>
</span>
<a th:href="@{/emps(pageNum=${pages})}">尾页</a>
</div>
3.6 测试
4. 写在最后
在Spring、Spring Boot 中使用 PageHalper 时导入的依赖不一样!
在Spring、Spring Boot 中配置属性时的方法不一样!