目录
1.介绍pageHelper
2.pageHelper的基本配置
3.使用pageHelper实现分页功能
一、介绍pageHelper
pageHelper是一款分页插件,它能很好的集成在spring boot中在它是一个基于mybatis的一款插件。它是的底层实现技术则是使用动态代理实现的。所以我们在使用它时,我们需要使用mybatis作为持久层框架。如果有需要请参照《spring boot 集成 mybatis》
二、pageHelper的基本配置
如果我们需要使用pageHelper的话,我们需要在spring boot项目中引入pageHelper的依赖。以下是PageHelper的GitHub地址https://github.com/pagehelper/Mybatis-PageHelper
在这里我们导入以下依赖:
com.github.pagehelper
pagehelper-spring-boot-starter
1.2.5
同样,我们在spring boot的application.properties中可以配置pageHelper的基本信息,
# 指定数据库,不指定的话会默认自动检测数据库类型
pagehelper.helperDialect=mysql
# 是否启用分页合理化。
# 如果启用,当pagenumpages时,自动查询最后一页数据;
# 不启用的,以上两种情况都会返回空数据
pagehelper.reasonable=true
# 默认值false,分页插件会从查询方法的参数值中,自动根据上面 params 配置的字段中取值,查找到合适的值时就会自动分页。
pagehelper.supportMethodsArguments=true
# 用于从对象中根据属性名取值,
# 可以配置 pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默认值,
# 默认值为pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero
pagehelper.params=count=countSql
在1.2.5这个版本中我们可以不用配置,使用默认的就够用了。
三、使用pageHelper实现分页功能
在上一步中,我们已近知道pageHelper的基本配置了。在这,我们使用pageHelper实现分页功能。
我们使用《mysql必知必会》中给出的数据库进行分页查询。
1.创建City实体类
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package com.springboot.pagehelper;
public class City {
// id
private int id;
// 国家名
private String name;
// 国家代码
private String countryCode;
// 地区
private String district;
// 人口
private int population;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCountryCode() {
return countryCode;
}
public void setCountryCode(String countryCode) {
this.countryCode = countryCode;
}
public String getDistrict() {
return district;
}
public void setDistrict(String district) {
this.district = district;
}
public int getPopulation() {
return population;
}
public void setPopulation(int population) {
this.population = population;
}
}
City
2.数据操作层查询出所有数据
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package com.springboot.pagehelper.mapper;
import com.springboot.pagehelper.City;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;
import java.util.List;
@Mapper
@Repository
public interface CityMapper {
// 获取所有城市
@Select("select * from city")
@Results({
@Result(property = "id",column = "ID"),
@Result(property = "name",column = "Name"),
@Result(property = "countryCode",column = "CountryCode"),
@Result(property = "district",column = "District"),
@Result(property = "population",column = "Population")
})
List selectCity();
}
CityMapper
3.创建业务接口
这里我们使用两种实现
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package com.springboot.pagehelper.service;
import com.github.pagehelper.Page;
import com.springboot.pagehelper.City;
import java.util.List;
public interface CityService {
List getcity();
Page pageCity();
}
CityService
4.实现业务接口
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package com.springboot.pagehelper.service;
import com.github.pagehelper.Page;
import com.springboot.pagehelper.City;
import com.springboot.pagehelper.mapper.CityMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class CityServiceImpl implements CityService {
@Autowired
private CityMapper mapper;
@Override
public List getcity() {
return mapper.selectCity();
}
@Override
public Page pageCity() {
return (Page)mapper.selectCity();
}
}
CityServiceImpl
5.控制层实现分页
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package com.springboot.pagehelper.controller;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.springboot.pagehelper.City;
import com.springboot.pagehelper.service.CityService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class DataController {
@Autowired
private CityService service;
@GetMapping("/citys/{page}")
public PageInfo lists(@PathVariable int page){
// 设置分页规则
PageHelper.startPage(page,10);
// 返回所有分页信息参数为查询所有记录的信息
PageInfo pageInfo = new PageInfo(service.pageCity());
return pageInfo;
}
@GetMapping("/city")
public List paraList(@RequestParam(defaultValue = "1") int p,
@RequestParam(defaultValue = "10") int size){
// 设置分页规则
PageHelper.startPage(p,size);
// 取数据,插件会自动按照规则分页显示数据
return service.getcity();
}
}
DataController
实现分页功能在使用时,PageInfo源码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/*
* The MIT License (MIT)
*
* Copyright (c) 2014-2017 [email protected]
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package com.github.pagehelper;
import java.io.Serializable;
import java.util.Collection;
import java.util.List;
/**
* 对Page结果进行包装
*
* 新增分页的多项属性,主要参考:http://bbs.csdn.net/topics/360010907
*
* @author liuzh/abel533/isea533
* @version 3.3.0
* @since 3.2.2
* 项目地址 : http://git.oschina.net/free/Mybatis_PageHelper
*/
@SuppressWarnings({"rawtypes", "unchecked"})
public class PageInfo extends PageSerializable {
//当前页
private int pageNum;
//每页的数量
private int pageSize;
//当前页的数量
private int size;
//由于startRow和endRow不常用,这里说个具体的用法
//可以在页面中"显示startRow到endRow 共size条数据"
//当前页面第一个元素在数据库中的行号
private int startRow;
//当前页面最后一个元素在数据库中的行号
private int endRow;
//总页数
private int pages;
//前一页
private int prePage;
//下一页
private int nextPage;
//是否为第一页
private boolean isFirstPage = false;
//是否为最后一页
private boolean isLastPage = false;
//是否有前一页
private boolean hasPreviousPage = false;
//是否有下一页
private boolean hasNextPage = false;
//导航页码数
private int navigatePages;
//所有导航页号
private int[] navigatepageNums;
//导航条上的第一页
private int navigateFirstPage;
//导航条上的最后一页
private int navigateLastPage;
public PageInfo() {
}
/**
* 包装Page对象
*
* @param list
*/
public PageInfo(List list) {
this(list, 8);
}
/**
* 包装Page对象
*
* @param list page结果
* @param navigatePages 页码数量
*/
public PageInfo(List list, int navigatePages) {
super(list);
if (list instanceof Page) {
Page page = (Page) list;
this.pageNum = page.getPageNum();
this.pageSize = page.getPageSize();
this.pages = page.getPages();
this.size = page.size();
//由于结果是>startRow的,所以实际的需要+1
if (this.size == 0) {
this.startRow = 0;
this.endRow = 0;
} else {
this.startRow = page.getStartRow() + 1;
//计算实际的endRow(最后一页的时候特殊)
this.endRow = this.startRow - 1 + this.size;
}
} else if (list instanceof Collection) {
this.pageNum = 1;
this.pageSize = list.size();
this.pages = this.pageSize > 0 ? 1 : 0;
this.size = list.size();
this.startRow = 0;
this.endRow = list.size() > 0 ? list.size() - 1 : 0;
}
if (list instanceof Collection) {
this.navigatePages = navigatePages;
//计算导航页
calcNavigatepageNums();
//计算前后页,第一页,最后一页
calcPage();
//判断页面边界
judgePageBoudary();
}
}
public static PageInfo of(List list){
return new PageInfo(list);
}
public static PageInfo of(List list, int navigatePages){
return new PageInfo(list, navigatePages);
}
/**
* 计算导航页
*/
private void calcNavigatepageNums() {
//当总页数小于或等于导航页码数时
if (pages pages) {
endNum = pages;
//最后navigatePages页
for (int i = navigatePages - 1; i >= 0; i--) {
navigatepageNums[i] = endNum--;
}
} else {
//所有中间页
for (int i = 0; i < navigatePages; i++) {
navigatepageNums[i] = startNum++;
}
}
}
}
/**
* 计算前后页,第一页,最后一页
*/
private void calcPage() {
if (navigatepageNums != null && navigatepageNums.length > 0) {
navigateFirstPage = navigatepageNums[0];
navigateLastPage = navigatepageNums[navigatepageNums.length - 1];
if (pageNum > 1) {
prePage = pageNum - 1;
}
if (pageNum 1;
hasNextPage = pageNum |