前言
PageHelper
分页插件,最方便使用的分页插件。分页插件支持任何复杂的单表、多表分页- 官方文档:https://pagehelper.github.io/
添加依赖
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
</dependency>
配置文件
这里有两种方式:
-
在
mybatis
的全局配置文件中配置<!-- plugins在配置文件中的位置必须符合要求,否则会报错,顺序如下: properties?, settings?, typeAliases?, typeHandlers?, objectFactory?,objectWrapperFactory?, plugins?, environments?, databaseIdProvider?, mappers? --> <plugins> <!-- com.github.pagehelper为PageHelper类所在包名 --> <plugin interceptor="com.github.pagehelper.PageInterceptor"> <!-- 使用下面的方式配置参数,后面会有所有的参数介绍 --> <property name="helperDialect" value="mysql"/> </plugin> </plugins>
-
在
application.yml
文件中配置# pageHelper分页配置 pagehelper: helper-dialect: mysql reasonable: true support-methods-arguments: true
简单使用
举个例子,前台用户列表数据展示
通用类准备
/**
* 返回数据实体
*/
public class AjaxResponse{
private String code;
private String errMsg;
private Object data;
public AjaxResponse(String code, String errMsg, Object data) {
this.code = code;
this.errMsg = errMsg;
this.data = data;
}
public AjaxResponse(String code, String errMsg) {
this.code = code;
this.errMsg = errMsg;
}
public static AjaxResponse suc(Object data){
return new AjaxResponse("200", "操作成功", data);
}
public static AjaxResponse err(String errMsg){
return new AjaxResponse("400", errMsg);
}
//省略get set
}
/**
* 基础分页参数类
*/
public class PageParam implements IPage {
//页码
private Integer pageNum = 1;
//页数,我这里设置默认设置2,一般是10,20
private Integer pageSize = 2;
//排序
private String orderBy;
@Override
public Integer getPageNum() {
return pageNum;
}
@Override
public Integer getPageSize() {
return pageSize;
}
@Override
public String getOrderBy() {
return orderBy;
}
}
流程类准备
-
参数实体,主要用于接收前台查询条件,以及
pageNum
和pageSize
等参数/** * 用户参数 */ public class UserListParam extends PageParam { //用户名 private String username; //....其他参数 public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } }
-
controller
/** * 用户controller */ @Controller @RequestMapping("/user") public class UserController { @Resource UserService userService; @GetMapping(value = "/getList") @ResponseBody public AjaxResponse getList(UserListParam listParam){ //这里接收一个PageInfo,包含了返回的list,总页数,总数等前台所需数据 PageInfo<User> pageInfo = userService.getPageList(listParam); return AjaxResponse.suc(pageInfo); } }
-
service
public interface UserService { /** * 分页查询 * * @param listParam 分页查询参数 * @return pageInfo */ public PageInfo<User> getPageList(UserListParam listParam); }
-
serviceImpl
@Service public class UserServiceImpl implements UserService { @Resource private UserMapper userMapper; //这里写了两种方式,我是比较常用第二种 @Override public PageInfo<User> getPageList(UserListParam listParam) { /* PageHelper.startPage((listParam.getPageNum(), listParam.getPageSize()); List<User> users = userMapper..getPageList(listParam); return new PageInfo<User>(users); */ return PageHelper.startPage(listParam.getPageNum(), listParam.getPageSize()) .doSelectPageInfo(() -> userMapper.getPageList(listParam)); } }
-
UserMapper
public interface UserMapper extends BaseMapper<User> { /** * 列表数据获取 * @param param 查询参数实体 * @return list */ List<User> getPageList(UserListParam param); }
-
UserMapper.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.example.springboot_mybatis.mapper.UserMapper"> <resultMap id="BaseResultMap" type="com.example.springboot_mybatis.model.User"> <id column="user_id" jdbcType="INTEGER" property="userId" /> <result column="username" jdbcType="VARCHAR" property="username" /> </resultMap> <sql id="Base_Column_List"> user_id, username </sql> <select id="getPageList" resultMap="BaseResultMap"> select * from t_user <where> <if test="username != null and username != ''"> instr(username, #{username}) > 0 </if> </where> </select> </mapper>
Page类
我们刚才调用service
返回的是PageInfo
类,这个类主要可以帮我们计算统计我们所需的一些属性,比如总页数,是否有下一页,是否有前一页等
//测试PageInfo
@Test
public void testPage(){
UserListParam listParam = new UserListParam();
listParam.setUsername("陈");
PageInfo<User> pageInfo = userService.getPageList(listParam);
//当前页数
System.out.println(pageInfo.getPageNum());
//每页的数量
System.out.println(pageInfo.getPageSize());
//总页数
System.out.println(pageInfo.getPages());
//总条数
System.out.println(pageInfo.getTotal());
//获取到的数据
System.out.println(pageInfo.getList());
}
简单测试
启动项目并访问http://localhost:8080/user/getList
,分页成功
{
code: "200",
errMsg: "操作成功",
data: {
total: 3,
list: [
{
userId: 1,
username: "陈某某"
},
{
userId: 4,
username: "陈AA"
}
],
pageNum: 1,
pageSize: 2,
size: 2,
startRow: 1,
endRow: 2,
pages: 2,
prePage: 0,
nextPage: 2,
isFirstPage: true,
isLastPage: false,
hasPreviousPage: false,
hasNextPage: true,
navigatePages: 8,
navigatepageNums: [
1,
2
],
navigateFirstPage: 1,
navigateLastPage: 2
}
}
通过日志我们可以查看除了分页查询
的sql
,还有一条查询总条数的sql
SELECT count(0) FROM t_user
SELECT user_id,username FROM t_user LIMIT ?
如果我们不需要查询总数:可以使用PageHelper
重载方法, 但是如果设置不去查询总数,总页数pages
也拿取不到
PageHelper.startPage(listParam.getPageNum(), listParam.getPageSize(), false);
/**
* 开始分页
*
* @param pageNum 页码
* @param pageSize 每页显示数量
* @param count 是否进行count查询
*/
public static <E> Page<E> startPage(int pageNum, int pageSize, boolean count) {
return startPage(pageNum, pageSize, count, null, null);
}