这篇文章主要介绍了spring boot集成pagehelper,记录使用pagehelper的两种配置方式。
目录
一、直接使用pagehelper
1、导入依赖
其他依赖我就没有复制了,这些依赖主要是记录一下版本,因为springboot和pagehelper集成的时候,版本不对会出各种问题甚至项目启动不起来。我用的是springboot1.5.12.RELEASE+pagehelper4.1.3
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.12.RELEASE</version>
<relativePath/>
</parent>
<dependencies>
<!-- mybatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
<!-- mybatis 依赖的分页组件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>4.1.3</version>
<scope>compile</scope>
</dependency>
</dependencies>
2、配置pagehelper
可能有的项目不用mybatis配置文件,没有的话需要加上,在springboot配置文件当中指定mybatis配置文件路径。
mybatis:
# 指定全局配置文件位置
config-location: classpath:mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<plugins>
<!-- com.github.pagehelper为PageHelper类所在包名 -->
<plugin interceptor="com.github.pagehelper.PageHelper">
<property name="dialect" value="mysql"/>
<!-- 该参数默认为false -->
<!-- 设置为true时,会将RowBounds第一个参数offset当成pageNum页码使用 -->
<!-- 和startPage中的pageNum效果一样-->
<property name="offsetAsPageNum" value="true"/>
<!-- 该参数默认为false -->
<!-- 设置为true时,使用RowBounds分页会进行count查询 -->
<property name="rowBoundsWithCount" value="true"/>
<!-- 设置为true时,如果pageSize=0或者RowBounds.limit = 0就会查询出全部的结果 -->
<!-- (相当于没有执行分页查询,但是返回结果仍然是Page类型)-->
<property name="pageSizeZero" value="true"/>
<!-- 3.3.0版本可用 - 分页参数合理化,默认false禁用 -->
<!-- 启用合理化时,如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页 -->
<!-- 禁用合理化时,如果pageNum<1或pageNum>pages会返回空数据 -->
<property name="reasonable" value="true"/>
<!-- 3.5.0版本可用 - 为了支持startPage(Object params)方法 -->
<!-- 增加了一个`params`参数来配置参数映射,用于从Map或ServletRequest中取值 -->
<!-- 可以配置pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默认值 -->
<!-- 不理解该含义的前提下,不要随便复制该配置 -->
<property name="params" value="pageNum=start;pageSize=limit;"/>
</plugin>
</plugins>
</configuration>
3、代码写法
controller层代码
// 不分页
@RequestMapping(value = "/findUserList",method = RequestMethod.GET)
public List<User> findUserList() {
return userService.findUserList();
}
// 单纯的分页,不需要分页信息
@RequestMapping(value = "/findUserListByPage",method = RequestMethod.GET)
public List<User> findUserListByPage() {
PageHelper.startPage(1, 5);
return userService.findUserList();
}
// 分页,直接使用PageInfo封装分页相关信息
@RequestMapping(value = "/findUserListByPageInfo",method = RequestMethod.GET)
public PageInfo<User> findUserListByPageInfo() {
PageHelper.startPage(1, 5);
List<User> list = userService.findUserList();
PageInfo<User> pageInfo = new PageInfo<User>(list);
return pageInfo;
}
// 分页,利用page获取分页信息,然后封装map
@RequestMapping(value = "/findUserListByPage1",method = RequestMethod.GET)
public Map<String, Object> findUserListByPage1() {
Map<String, Object> result = new HashMap<>();
// 设置分页,1代表第一页,5代表这一页有五条数据
Page<User> page = PageHelper.startPage(1, 5);
userService.findUserList();
result.put("total", page.getTotal());
result.put("pageNo", page.getPageNum());
result.put("pages", page.getPages());
result.put("pageSize", page.getPageSize());
result.put("rows", page.getResult());
return result;
}
service层代码
@Autowired
private UserMapper userMapper;
public List<User> findUserList() {
return userMapper.findUserList();
}
xml代码
<select id="findUserList" resultType="com.gzl.cn.domain.User">
SELECT * FROM user
</select>
map方式查询出来的结果:
二、使用pagehelper-spring-boot-starter
1、导入依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.12.RELEASE</version>
<relativePath/>
</parent>
<dependencies>
<!-- mybatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
<!--分页插件 pagehelper -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
2、配置pagehelper
#分页pageHelper
pagehelper:
helperDialect: mysql
reasonable: true #为了使用输入页数为负或者超出最大页时候使页数为最小或最大值
supportMethodsArguments: true
params: count=countSql
pageSizeZero: true
·helper-dialect:
配置使用哪种数据库语言,不配置的话pageHelper也会自动检测
·reasonable:
配置分页参数合理化功能,默认是false。 #启用合理化时,如果pageNum<1会查询第一页,如果pageNum>总页数会查询最后一页; #禁用合理化时,如果pageNum<1或pageNum>总页数会返回空数据。
·params:
为了支持startPage(Object params)方法,增加了该参数来配置参数映射,用于从对象中根据属性名取值; 可以配置 pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默认值, 默认值为pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero。
·support-methods-arguments:
支持通过Mapper接口参数来传递分页参数,默认值false,分页插件会从查询方法的参数值中,自动根据上面 params 配置的字段中取值,查找到合适的值时就会自动分页。
pageSizeZero
pageSize=0 or RowBounds.Limit = 0的时候就不适用分页,但是返回对象还是PageInfo
三、PageInfo参数
使用PageInfo相当于查出来的属性特别多,速度上会有一定的影响。
下面记录了一下他的分页属性备注。
pageNum=1,当前页码
pageSize=1,每页个数
size=1,当前页个数
startRow=1,由第几条开始
endRow=1,到第几条结束
total=3,总条数
pages=3,总页数
list= XXXX 查出出来的数据集合
prePage=0,上一页
nextPage=2,下一页
isFirstPage=true,是否为首页
isLastPage=false,是否为尾页
hasPreviousPage=false,是否有上一页
hasNextPage=true,是否有下一页
navigatePages=8,每页显示的页码个数
navigateFirstPage=1,首页
navigateLastPage=3,尾页
navigatepageNums=[1, 2, 3]}页码数
四、注意
建议不要使用PageInfo来封装结果,性能特别差。
下面这个还是仅仅有十几条数据的表,假如数据量大的话,可见性能有多么差。
使用pageInfo速度:
不用pageInfo直接用page取结果速度:
如果需要分页信息建议使用map封装page结果比较好点,我们公司的项目基本上都是这么用的。