使用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/
版權所有,歡迎轉載,轉載請注明原文作者及出處。