使用Mybatis时,最头痛的就是写分页,需要先写一个查询count的select语句,然后再写一个真正分页查询的语句,当查询条件多了之后,会发现真不想花双倍的时间写 count 和 select,幸好我们有 pagehelper 分页插件,pagehelper 是一个强大实用的 MyBatis 分页插件,可以帮助我们快速的实现分页功能。那么,接下来我们就来一起体验下吧。
添加依赖
在 kitty-admin pom.xml 文件内添加分页插件依赖包。
pom.xml
com.github.pagehelper
pagehelper-spring-boot-starter
1.2.5
添加配置
在 kitty-boo/application.yml 配置文件内添加分页插件配置。
application.yml
# pagehelper
pagehelper:
helperDialect: mysql
reasonable:truesupportMethodsArguments:trueparams: count=countSql
分页代码
首先,在 DAO 层添加分页查找方法。因为我们的表只有菜单有多条数据,所以选择给菜单加一个分页查询接口。
SysMenuMapper.java
packagecom.louis.kitty.admin.dao;importjava.util.List;importcom.louis.kitty.admin.model.SysMenu;public interfaceSysMenuMapper {intdeleteByPrimaryKey(Long menuId);intinsert(SysMenu record);intinsertSelective(SysMenu record);
SysMenu selectByPrimaryKey(Long menuId);intupdateByPrimaryKeySelective(SysMenu record);intupdateByPrimaryKey(SysMenu record);/*** 分页查询
*@return
*/ListselectPage();
}
给 SysMenuMapper.xml 添加查询方法,这是一个普通的查找全部记录的查询语句,并不需要写分页SQL,分页插件会拦截查询请求,并读取前台传来的分页查询参数重新生成分页查询语句。
SysMenuMapper.xml
selectfrom sys_menu
服务层调用DAO层完成分页查询,这里统一封装分页查询的请求和结果类,从而避免因为替换ORM框架而导致服务层、控制层的分页接口也需要变动的情况,替换ORM框架也不会影响服务层以上的分页接口,起到了解耦的作用。
SysMenuService.java
packagecom.louis.kitty.admin.sevice;importcom.louis.kitty.admin.page.PageRequest;importcom.louis.kitty.admin.page.PageResult;public interfaceSysMenuService {/*** 分页查询接口
* 这里统一封装了分页请求和结果,避免直接引入具体框架的分页对象, 如MyBatis或JPA的分页对象
* 从而避免因为替换ORM框架而导致服务层、控制层的分页接口也需要变动的情况,替换ORM框架也不会
* 影响服务层以上的分页接口,起到了解耦的作用
*@parampageRequest 自定义,统一分页查询请求
*@returnPageResult 自定义,统一分页查询结果*/PageResult findPage(PageRequest pageRequest);
}
服务实现类调用分页插件完成分页查询,关键代码是PageHelper.startPage(pageNum, pageSize),将前台分页查询参数传入。
SysMenuServiceImpl.java
packagecom.louis.kitty.admin.sevice.impl;importjava.util.List;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Service;importcom.github.pagehelper.PageHelper;importcom.github.pagehelper.PageInfo;importcom.louis.kitty.admin.dao.SysMenuMapper;importcom.louis.kitty.admin.model.SysMenu;importcom.louis.kitty.admin.page.PageRequest;importcom.louis.kitty.admin.page.PageResult;importcom.louis.kitty.admin.page.PageUtils;importcom.louis.kitty.admin.sevice.SysMenuService;
@Servicepublic class SysMenuServiceImpl implementsSysMenuService {
@AutowiredprivateSysMenuMapper sysMenuMapper;
@OverridepublicPageResult findPage(PageRequest pageRequest) {returnPageUtils.getPageResult(pageRequest, getPageInfo(pageRequest));
}/*** 调用分页插件完成分页
*@parampageQuery
*@return
*/
private PageInfogetPageInfo(PageRequest pageRequest) {int pageNum =pageRequest.getPageNum();int pageSize =pageRequest.getPageSize();
PageHelper.startPage(pageNum, pageSize);
List sysMenus =sysMenuMapper.selectPage();return new PageInfo(sysMenus);
}
}
PageRequest.java
packagecom.louis.kitty.admin.page;/*** 分页请求*/
public classPageRequest {/*** 当前页码*/
private intpageNum;/*** 每页数量*/
private intpageSize;public intgetPageNum() {returnpageNum;
}public void setPageNum(intpageNum) {this.pageNum =pageNum;
}public intgetPageSize() {returnpageSize;
}public void setPageSize(intpageSize) {this.pageSize =pageSize;
}
}
PageResult.java
packagecom.louis.kitty.admin.page;importjava.util.List;/*** 分页返回结果*/
public classPageResult {/*** 当前页码*/
private intpageNum;/*** 每页数量*/
private intpageSize;/*** 记录总数*/
private longtotalSize;/*** 页码总数*/
private inttotalPages;/*** 数据模型*/
private List>content;public intgetPageNum() {returnpageNum;
}public void setPageNum(intpageNum) {this.pageNum =pageNum;
}public intgetPageSize() {returnpageSize;
}public void setPageSize(intpageSize) {this.pageSize =pageSize;
}public longgetTotalSize() {returntotalSize;
}public void setTotalSize(longtotalSize) {this.totalSize =totalSize;
}public intgetTotalPages() {returntotalPages;
}public void setTotalPages(inttotalPages) {this.totalPages =totalPages;
}public List>getContent() {returncontent;
}public void setContent(List>content) {this.content =content;
}
}
PageUtils.java
packagecom.louis.kitty.admin.page;importcom.github.pagehelper.PageInfo;public classPageUtils {/*** 将分页信息封装到统一的接口
*@parampageRequest
*@parampage
*@return
*/
public static PageResult getPageResult(PageRequest pageRequest, PageInfo>pageInfo) {
PageResult pageResult= newPageResult();
pageResult.setPageNum(pageInfo.getPageNum());
pageResult.setPageSize(pageInfo.getPageSize());
pageResult.setTotalSize(pageInfo.getTotal());
pageResult.setTotalPages(pageInfo.getPages());
pageResult.setContent(pageInfo.getList());returnpageResult;
}
}
SysMenuController.java
packagecom.louis.kitty.admin.controller;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.PostMapping;importorg.springframework.web.bind.annotation.RequestBody;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;importcom.louis.kitty.admin.page.PageRequest;importcom.louis.kitty.admin.sevice.SysMenuService;
@RestController
@RequestMapping("menu")public classSysMenuController {
@AutowiredprivateSysMenuService sysMenuService;
@PostMapping(value="/findPage")publicObject findPage(@RequestBody PageRequest pageQuery) {returnsysMenuService.findPage(pageQuery);
}
}
接口测试
参数:pageNum: 1, pageSize: 5
测试结果
参数:pageNum: 2, pageSize: 5
测试结果
参考资料
源码下载