1.pom
<!-- pagehelper -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.5</version>
</dependency>
2.1 pojo包中,分页返回结果类PageResult
import java.util.List;
/**
* 分页返回结果
*/
public class PageResult {
/**
* 当前页码
*/
private int pageNum;
/**
* 每页数量
*/
private int pageSize;
/**
* 记录总数
*/
private long totalSize;
/**
* 页码总数
*/
private int totalPages;
/**
* 数据模型
*/
private List<?> content;
public int getPageNum() {
return pageNum;
}
public void setPageNum(int pageNum) {
this.pageNum = pageNum;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public long getTotalSize() {
return totalSize;
}
public void setTotalSize(long totalSize) {
this.totalSize = totalSize;
}
public int getTotalPages() {
return totalPages;
}
public void setTotalPages(int totalPages) {
this.totalPages = totalPages;
}
public List<?> getContent() {
return content;
}
public void setContent(List<?> content) {
this.content = content;
}
}
2.2 pojo包中,将分页信息封装到统一的接口PageUtils
import com.github.pagehelper.PageInfo;
public class PageUtils {
/**
* 将分页信息封装到统一的接口
* @param pageNum
* @param pageSize
* @param pageInfo
* @return
*/
public static PageResult getPageResult(int pageNum, int pageSize, PageInfo<?> pageInfo) {
PageResult pageResult = new PageResult();
pageResult.setPageNum(pageNum);
pageResult.setPageSize(pageSize);
pageResult.setTotalSize(pageInfo.getTotal());
pageResult.setTotalPages(pageInfo.getPages());
pageResult.setContent(pageInfo.getList());
return pageResult;
}
}
3.FoodMapper.java接口--和之前查询一样
List<Food> selectList(Map map);
4.FoodMapper.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.elm.elmbootrj01.mapper.FoodMapper" >
<resultMap id="FoodResultMap" type="Food" >
<id column="foodId" property="foodId" jdbcType="INTEGER" />
<result column="foodName" property="foodName" jdbcType="VARCHAR" />
<result column="foodExplain" property="foodExplain" jdbcType="VARCHAR" />
<result column="foodPrice" property="foodPrice" jdbcType="DECIMAL" />
<result column="businessId" property="businessId" jdbcType="INTEGER" />
</resultMap>
<sql id="Food_Column_List" >
foodId, foodName, foodExplain, foodPrice, businessId
</sql>
<select id="selectList" resultMap="FoodResultMap">
select
<include refid="Food_Column_List" />
from food
<trim prefix="where" prefixOverrides="AND|OR">
<if test="foodName!=null and foodName!=''">
AND foodName like '%${foodName}%'
</if>
<if test="lowPrice!=null and lowPrice!=0">
AND foodPrice >= #{lowPrice}
</if>
<if test="highPrice!=null and highPrice!=0">
AND foodPrice <= #{highPrice}
</if>
</trim>
</select>
</mapper>
5.重点在业务层处理分页
5.1 业务接口
/**
* 分页查询接口
* 这里统一封装了分页请求和结果,避免直接引入具体框架的分页对象, 如MyBatis或JPA的分页对象
* 从而避免因为替换ORM框架而导致服务层、控制层的分页接口也需要变动的情况,替换ORM框架也不会
* 影响服务层以上的分页接口,起到了解耦的作用
* @param pageNum,pageSize 自定义,统一分页查询请求
* @return PageResult 自定义,统一分页查询结果
*/
PageResult findPage(int pageNum, int pageSize, Map map);
5.2 业务层实现类
@Override
public PageResult findPage(int pageNum, int pageSize, Map map) {
return PageUtils.getPageResult(pageNum,pageSize, getPageInfo(pageNum,pageSize,map));
}
/**
* 调用分页插件完成分页
* @param pageNum,pageSize,map
* @return
*/
private PageInfo<Food> getPageInfo(int pageNum,int pageSize,Map map) {
PageHelper.startPage(pageNum, pageSize);
List<Food> foodList = foodMapper.selectList(map);
return new PageInfo<Food>(foodList);
}
6.controller
6.1 返回json格式字符串
@RequestMapping(value="/findPageJson")
public @ResponseBody Object findPageJson(@RequestParam("pageNum")Integer pageNum,//页码
@RequestParam("pageSize")Integer pageSize,//页大小
Map map) {//map为多条件查询参数
return foodService.findPage(pageNum,pageSize,map);
}
6.2 返回分页结果到jsp
@RequestMapping(value="/findPageToJsp")
public String findPageToJsp(Model model,@RequestParam("pageNum")Integer pageNum,
@RequestParam("pageSize")Integer pageSize,
Map map) {
model.addAttribute("pageData",foodService.findPage(pageNum,pageSize,map));
return "food/listPage";
}
7. jsp页面
listPage.jsp

image.png
<p>
共${pageData.totalPages}页 第${pageData.pageNum}页
<c:if test="${pageData.pageNum-1>0}">
<a href="${pageContext.request.contextPath }/FoodController/findPageToJsp?pageSize=5&pageNum=${pageData.pageNum-1}">上一页</a>
</c:if>
<c:if test="${pageData.pageNum+1<=pageData.totalPages}">
<a href="${pageContext.request.contextPath }/FoodController/findPageToJsp?pageSize=5&pageNum=${pageData.pageNum+1}">下一页</a>
</c:if>
</p>
8.测试
8.1 测试获取json格式的数据

image.png
8.2 jsp页面测试

image.png

image.png

image.png