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/

https://pagehelper.github.io/docs/howtouse/

源碼下載

后端:https://gitee.com/liuge1988/kitty

前端:https://gitee.com/liuge1988/kitty-ui.git


作者:朝雨憶輕塵
出處:https://www.cnblogs.com/xifengxiaoma/ 
版權所有,歡迎轉載,轉載請注明原文作者及出處。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM