Spring Boot + Spring Cloud 实现权限管理系统 后端篇(八):MyBatis分页功能实现
使用Mybatis时,最头痛的就是写分页,需要先写一个查询count的select语句,然后再写一个真正分页查询的语句,当查询条件多了之后,会发现真不想花双倍的时间写 count 和 select,幸好我们有 pagehelper 分页插件,pagehelper 是一个强大实用的 MyBatis 分页插件,可以帮助我们快速的实现分页功能。那么,接下来我们就来一起体验下吧。
添加依赖
在 kitty-admin pom.xml 文件内添加分页插件依赖包。
pom.xml
<!-- pagehelper --> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.2.5</version> </dependency>
添加配置
在 kitty-boo/application.yml 配置文件内添加分页插件配置。
application.yml
# pagehelper pagehelper: helperDialect: mysql reasonable: true supportMethodsArguments: true params: count=countSql
分页代码
首先,在 DAO 层添加分页查找方法。因为我们的表只有菜单有多条数据,所以选择给菜单加一个分页查询接口。
SysMenuMapper.java
package com.louis.kitty.admin.dao; import java.util.List; import com.louis.kitty.admin.model.SysMenu; public interface SysMenuMapper { int deleteByPrimaryKey(Long menuId); int insert(SysMenu record); int insertSelective(SysMenu record); SysMenu selectByPrimaryKey(Long menuId); int updateByPrimaryKeySelective(SysMenu record); int updateByPrimaryKey(SysMenu record); /** * 分页查询 * @return */ List<SysMenu> selectPage(); }
给 SysMenuMapper.xml 添加查询方法,这是一个普通的查找全部记录的查询语句,并不需要写分页SQL,分页插件会拦截查询请求,并读取前台传来的分页查询参数重新生成分页查询语句。
SysMenuMapper.xml
<select id="selectPage" resultMap="BaseResultMap"> select <include refid="Base_Column_List" /> from sys_menu </select>
服务层调用DAO层完成分页查询,这里统一封装分页查询的请求和结果类,从而避免因为替换ORM框架而导致服务层、控制层的分页接口也需要变动的情况,替换ORM框架也不会影响服务层以上的分页接口,起到了解耦的作用。
SysMenuService.java
package com.louis.kitty.admin.sevice; import com.louis.kitty.admin.page.PageRequest; import com.louis.kitty.admin.page.PageResult; public interface SysMenuService { /** * 分页查询接口 * 这里统一封装了分页请求和结果,避免直接引入具体框架的分页对象, 如MyBatis或JPA的分页对象 * 从而避免因为替换ORM框架而导致服务层、控制层的分页接口也需要变动的情况,替换ORM框架也不会 * 影响服务层以上的分页接口,起到了解耦的作用 * @param pageRequest 自定义,统一分页查询请求 * @return PageResult 自定义,统一分页查询结果 */ PageResult findPage(PageRequest pageRequest); }
服务实现类调用分页插件完成分页查询,关键代码是 PageHelper.startPage(pageNum, pageSize),将前台分页查询参数传入。
SysMenuServiceImpl.java
package com.louis.kitty.admin.sevice.impl; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.louis.kitty.admin.dao.SysMenuMapper; import com.louis.kitty.admin.model.SysMenu; import com.louis.kitty.admin.page.PageRequest; import com.louis.kitty.admin.page.PageResult; import com.louis.kitty.admin.page.PageUtils; import com.louis.kitty.admin.sevice.SysMenuService; @Service public class SysMenuServiceImpl implements SysMenuService { @Autowired private SysMenuMapper sysMenuMapper; @Override public PageResult findPage(PageRequest pageRequest) { return PageUtils.getPageResult(pageRequest, getPageInfo(pageRequest)); } /** * 调用分页插件完成分页 * @param pageQuery * @return */ private PageInfo<SysMenu> getPageInfo(PageRequest pageRequest) { int pageNum = pageRequest.getPageNum(); int pageSize = pageRequest.getPageSize(); PageHelper.startPage(pageNum, pageSize); List<SysMenu> sysMenus = sysMenuMapper.selectPage(); return new PageInfo<SysMenu>(sysMenus); } }
PageRequest.java
package com.louis.kitty.admin.page; /** * 分页请求 */ public class PageRequest { /** * 当前页码 */ private int pageNum; /** * 每页数量 */ private int pageSize; 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; } }
PageResult.java
package com.louis.kitty.admin.page; 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; } }
PageUtils.java
package com.louis.kitty.admin.page; import com.github.pagehelper.PageInfo; public class PageUtils { /** * 将分页信息封装到统一的接口 * @param pageRequest * @param page * @return */ public static PageResult getPageResult(PageRequest pageRequest, PageInfo<?> pageInfo) { PageResult pageResult = new PageResult(); pageResult.setPageNum(pageInfo.getPageNum()); pageResult.setPageSize(pageInfo.getPageSize()); pageResult.setTotalSize(pageInfo.getTotal()); pageResult.setTotalPages(pageInfo.getPages()); pageResult.setContent(pageInfo.getList()); return pageResult; } }
SysMenuController.java
package com.louis.kitty.admin.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.louis.kitty.admin.page.PageRequest; import com.louis.kitty.admin.sevice.SysMenuService; @RestController @RequestMapping("menu") public class SysMenuController { @Autowired private SysMenuService sysMenuService; @PostMapping(value="/findPage") public Object findPage(@RequestBody PageRequest pageQuery) { return sysMenuService.findPage(pageQuery); } }
接口测试
启动应用,访问:localhost:8088/swagger-ui.html,找到对应接口,模拟测试,结果如下。
参数:pageNum: 1, pageSize: 5
测试结果
参数:pageNum: 2, pageSize: 5
测试结果
参考资料
https://pagehelper.github.io/docs/howtouse/
源码下载
后端:https://gitee.com/liuge1988/kitty
前端:https://gitee.com/liuge1988/kitty-ui.git
作者:朝雨忆轻尘
出处:https://www.cnblogs.com/xifengxiaoma/
版权所有,欢迎转载,转载请注明原文作者及出处。