zoukankan      html  css  js  c++  java
  • 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/ 
    版权所有,欢迎转载,转载请注明原文作者及出处。

  • 相关阅读:
    一月份反思内容:BUG & Communicate
    重构一个繁琐的数据结构
    GTD(Get Things Done)
    SortedList<TKey,TValue> 和 SortedDictionary<TKey,TValue>
    对Ado.net Entity Data Model Designer很失望
    A class to clone objects
    collection.All(x=> whatever(x)) 与 collection.Any(x=>whatever(x))
    Asp.net MVC里的TempData是一个整体
    Some tips about ubuntu server | or it may works on other linux distributions too
    每个程序员都必须遵守的编程原则
  • 原文地址:https://www.cnblogs.com/xifengxiaoma/p/9498530.html
Copyright © 2011-2022 走看看