第一步,添加pageHelper依赖
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.5</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.7</version>
</dependency>
第二步,设置配置文件
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
pagehelper.helperDialect=mysql
pagehelper.reasonable=true
pagehelper.supportMethodsArguments=true
pagehelper.params=count=countSql
pagehelper.page-size-zero=true
Dialect:4.0.0以后版本可以不设置该参数,指明使用的是什么数据库
offsetAsPageNum:该参数默认为false,设置为true时,会将RowBounds第一个参数offset当成pageNum页码使用 和startPage中的pageNum效果一样
rowBoundsWithCount:该参数默认为false,设置为true时,使用RowBounds分页会进行count查询
pageSizeZero:设置为true时,如果pageSize=0或者RowBounds.limit = 0就会查询出全部的结果(相当于没有执行分页查询,但是返回结果仍然是Page类型)
Reasonable: 3.3.0版本可用 - 分页参数合理化,默认false禁用,启用合理化时,如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页 ,禁用合理化时,如果pageNum<1或pageNum>pages会返回空数据
supportMethodsArguments:支持通过Mapper接口参数来传递分页参数
returnPageInfo:always总是返回PageInfo类型,check检查返回类型是否为PageInfo,none返回Page
Params:3.5.0版本可用 - 为了支持startPage(Object params)方法,增加了一个params
参数来配置参数映射,用于从Map或ServletRequest中取值,可以配置pageNum,pageSize,count,pageSizeZero,reasonable,orderBy,不配置映射的用默认值,不理解该含义的前提下,不要随便复制该配置
第三步,添加实体层
@Data
public class User {
private Integer id;
private String name;
private Integer age;
}
第四步,添加mapper 层
public interface UserMapper {
@Select("SELECT * FROM USERS ")
List<User> userList();
}
第五步,添加Service层
@Service
public class UserPageHelperService {
@Autowired
private UserMapper userMapper;
public PageInfo<User> userList(int page,int pageSize){
//mysql 分页查询 limit oraclet 伪列 sqlserver top
//PageHelper 帮我们改写sql语句 生成分页语句
PageHelper.startPage(page,pageSize);
List<User> users = userMapper.userList();
PageInfo<User> pageInfoUserList=new PageInfo<User>(users);
return pageInfoUserList;
}
}
PageHelper 原理,根据配置文件中使用的数据库类型帮我们改写sql语句 生成分页语句
支持的数据库有:
oracle,mysql,mariadb,sqlite,hsqldb,postgresql,db2,sqlserver,informix,h2,sqlserver2012
在4.0.0版本以后,dialect参数可以不配置,系统能自动识别这里提到的所有数据库。
对于不支持的数据库,可以实现com.github.pagehelper.parser.Parser接口,然后配置到dialect参数中(4.0.2版本增加)。
第六步,添加控制器,测试分页效果
@RestController
public class UserListController {
@Autowired
private UserPageHelperService userPageHelperService;
@RequestMapping("/getuserlist")
public PageInfo<User> getUserList(int page,int pageSize){
return userPageHelperService.userList(page,pageSize);
}
}
运行项目,浏览器访问:
http://127.0.0.1:8080/getuserlist?page=1&pageSize=2
分页效果
{
"total": 10,
"list": [{
"id": 1,
"name": "xxxx",
"age": 11
}, {
"id": 2,
"name": "xxxx",
"age": 11
}],
"pageNum": 1,
"pageSize": 2,
"size": 2,
"startRow": 1,
"endRow": 2,
"pages": 5,
"prePage": 0,
"nextPage": 2,
"isFirstPage": true,
"isLastPage": false,
"hasPreviousPage": false,
"hasNextPage": true,
"navigatePages": 8,
"navigatepageNums": [1, 2, 3, 4, 5],
"navigateFirstPage": 1,
"navigateLastPage": 5,
"firstPage": 1,
"lastPage": 5
}
PageInfo 中的成员变量说明
· //当前页
· private int pageNum;
· //每页的数量
· private int pageSize;
· //当前页的数量
· private int size;
· //由于startRow和endRow不常用,这里说个具体的用法
· //可以在页面中"显示startRow到endRow 共size条数据"
·
· //当前页面第一个元素在数据库中的行号
· private int startRow;
· //当前页面最后一个元素在数据库中的行号
· private int endRow;
· //总记录数
· private long total;
· //总页数
· private int pages;
· //结果集
· private List<T> list;
·
· //第一页
· private int firstPage;
· //前一页
· private int prePage;
·
· //是否为第一页
· private boolean isFirstPage = false;
· //是否为最后一页
· private boolean isLastPage = false;
· //是否有前一页
· private boolean hasPreviousPage = false;
· //是否有下一页
· private boolean hasNextPage = false;
· //导航页码数
· private int navigatePages;
· //所有导航页号
· private int[] navigatepageNums;