综合概述

想必大家都有过这样的体验,在使用Mybatis时,最头痛的就是写分页了,需要先写一个查询count的select语句,然后再写一个真正分页查询的语句,当查询条件多了之后,会发现真的不想花双倍的时间写 count 和 select,幸好我们有 pagehelper 分页插件,pagehelper 是一个强大实用的 MyBatis 分页插件,可以帮助我们快速的实现MyBatis分页功能,而且pagehelper有个优点是,分页和Mapper.xml完全解耦,并以插件的形式实现,对Mybatis执行的流程进行了强化,这有效的避免了我们需要直接写分页SQL语句来实现分页功能。那么,接下来我们就来一起体验下吧。

添加相关依赖

首先,我们需要在 pom.xml 文件中添加分页插件依赖包。

pom.xml

<!-- pagehelper -->
<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.2.5</version>
</dependency>

添加相关配置

然后在 application.yml 配置文件中添加分页插件有关的配置。

application.yml

# pagehelper
pagehelper:helperDialect: mysqlreasonable: truesupportMethodsArguments: trueparams: count=countSql

编写分页代码

首先,在 DAO 层添加一个分页查找方法。这个查询方法跟查询全部数据的方法除了名称几乎一样。

SysUserMapper.java

package com.louis.springboot.demo.dao;import java.util.List;
import com.louis.springboot.demo.model.SysUser;public interface SysUserMapper {int deleteByPrimaryKey(Long id);int insert(SysUser record);int insertSelective(SysUser record);SysUser selectByPrimaryKey(Long id);int updateByPrimaryKeySelective(SysUser record);int updateByPrimaryKey(SysUser record);/*** 查询全部用户* @return*/List<SysUser> selectAll();/*** 分页查询用户* @return*/List<SysUser> selectPage();
}

然后在 SysUserMapper.xml 中加入selectPage的实现,当然你也可以直接用@Select注解将查询语句直接写在DAO代码,但我们这里选择写在XML映射文件,这是一个普通的查找全部记录的查询语句,并不需要写分页SQL,分页插件会拦截查询请求,并读取前台传来的分页查询参数重新生成分页查询语句。

SysUserMapper.xml

<select id="selectPage"  resultMap="BaseResultMap">select <include refid="Base_Column_List" />from sys_user
</select>

服务层通过调用DAO层代码完成分页查询,这里统一封装分页查询的请求和结果类,从而避免因为替换ORM框架而导致服务层、控制层的分页接口也需要变动的情况,替换ORM框架也不会影响服务层以上的分页接口,起到了解耦的作用。

SysUserService.java

package com.louis.springboot.demo.service;
import java.util.List;
import com.louis.springboot.demo.model.SysUser;
import com.louis.springboot.demo.util.PageRequest;
import com.louis.springboot.demo.util.PageResult;public interface SysUserService {/*** 根据用户ID查找用户* @param userId* @return*/SysUser findByUserId(Long userId);/*** 查找所有用户* @return*/List<SysUser> findAll();/*** 分页查询接口* 这里统一封装了分页请求和结果,避免直接引入具体框架的分页对象, 如MyBatis或JPA的分页对象* 从而避免因为替换ORM框架而导致服务层、控制层的分页接口也需要变动的情况,替换ORM框架也不会* 影响服务层以上的分页接口,起到了解耦的作用* @param pageRequest 自定义,统一分页查询请求* @return PageResult 自定义,统一分页查询结果*/PageResult findPage(PageRequest pageRequest);
}

服务实现类通过调用分页插件完成最终的分页查询,关键代码是 PageHelper.startPage(pageNum, pageSize),将前台分页查询参数传入并拦截MyBtis执行实现分页效果。

SysUserServiceImpl.java

package com.louis.springboot.demo.service.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.springboot.demo.dao.SysUserMapper;
import com.louis.springboot.demo.model.SysUser;
import com.louis.springboot.demo.service.SysUserService;
import com.louis.springboot.demo.util.PageRequest;
import com.louis.springboot.demo.util.PageResult;
import com.louis.springboot.demo.util.PageUtils;@Service
public class SysUserServiceImpl implements SysUserService {@Autowiredprivate SysUserMapper sysUserMapper;@Overridepublic SysUser findByUserId(Long userId) {return sysUserMapper.selectByPrimaryKey(userId);}@Overridepublic List<SysUser> findAll() {return sysUserMapper.selectAll();}@Overridepublic PageResult findPage(PageRequest pageRequest) {return PageUtils.getPageResult(pageRequest, getPageInfo(pageRequest));}/*** 调用分页插件完成分页* @param pageQuery* @return*/private PageInfo<SysUser> getPageInfo(PageRequest pageRequest) {int pageNum = pageRequest.getPageNum();int pageSize = pageRequest.getPageSize();PageHelper.startPage(pageNum, pageSize);List<SysUser> sysMenus = sysUserMapper.selectPage();return new PageInfo<SysUser>(sysMenus);}
}

在控制器SysUserController中添加分页查询方法,并调用服务层的分页查询方法。

SysUserController.java

package com.louis.springboot.demo.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
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.RequestParam;
import org.springframework.web.bind.annotation.RestController;import com.louis.springboot.demo.service.SysUserService;
import com.louis.springboot.demo.util.PageRequest;@RestController
@RequestMapping("user")
public class SysUserController {@Autowiredprivate SysUserService sysUserService;@GetMapping(value="/findByUserId")public Object findByUserId(@RequestParam Long userId) {return sysUserService.findByUserId(userId);}@GetMapping(value="/findAll")public Object findAll() {return sysUserService.findAll();}@PostMapping(value="/findPage")public Object findPage(@RequestBody PageRequest pageQuery) {return sysUserService.findPage(pageQuery);}
}

分页查询请求封装类。

PageRequest.java

package com.louis.springboot.demo.util;
/*** 分页请求*/
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.springboot.demo.util;
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.springboot.demo.util;
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;}
}

编译测试运行

启动应用,访问:localhost:8088/swagger-ui.html,找到对应接口,模拟测试,结果如下。

参数:pageNum: 1, pageSize: 5

原文地址:https://www.cnblogs.com/xifengxiaoma/p/11027551.html

Spring Boot实现MyBatis分页查询相关推荐

  1. springboot 分页查询参数_10. Spring Boot 中的分页查询

    在Spring Boot中使用分页查询主要依赖了org.springframework.data.domain.*包下面的及格分页类的功能.使用分页查询常见有两种方式,一种是直接在程序中写死分页的参数 ...

  2. Spring Boot系列六 Spring boot集成mybatis、分页插件pagehelper

    1. 概述 本文的内容包括如下内容: Spring Boot集成mybatis Spring Boot集成pagehelper分页插件,定义分页的相关类 实现工具类:model转dto,实现数据层和传 ...

  3. spring boot整合mybatis+通用mapper+pagehelper分页插件

    spring boot整合mybatis+通用mapper+pagehelper分页插件 pom依赖 <?xml version="1.0" encoding="U ...

  4. Spring Boot 实战 —— MyBatis(注解版)使用方法

    原文链接: Spring Boot 实战 -- MyBatis(注解版)使用方法 简介 MyBatis 官网 是这么介绍它自己的: MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过 ...

  5. mybatis 分页查询_MyBatis之分页查询:MyBatis PageHelper

    MyBatis,作为目前流行的ORM框架,大大方便了日常开发.而对于分页查询,虽然可以通过SQL的limit语句实现,但是比较繁琐.而MyBatis PageHelper的出现,则解决了这一痛点.这里 ...

  6. Spring Boot 整合MyBatis(23)

    Spring Boot 整合MyBatis Spring Boot 整合 Druid 引入依赖 配置 application.yml pring Boot 整合 tk.mybatis 引入依赖 配置 ...

  7. Java项目:养老院管理系统(java+Spring Boot + SpringMVC + MyBatis+HTML+CSS+JavaScrip+ Layui+maven+mysql)

    源码获取:博客首页 "资源" 里下载! 关注公众号,带你学Java 项目介绍 : Spring Boot + SpringMVC + MyBatis+ Mysql + druid ...

  8. Spring Boot + Security + MyBatis + Thymeleaf + Activiti 快速开发平台项目

    项目介绍 Spring Boot + Security + MyBatis + Thymeleaf + Activiti 快速开发平台 基于 Layui 的后台管理系统模板,扩展 Layui 原生 U ...

  9. Spring Boot与MyBatis整合

    2019独角兽企业重金招聘Python工程师标准>>> 数据库以MySQL为例 IDE:spring tool suite 1. 新建项目 file -> new -> ...

最新文章

  1. android 设置setmultichoiceitems设置初始化勾选_阿里巴巴Java开发手册建议创建HashMap时设置初始化容量,但是多少合适呢?...
  2. 神秘的中国超算:比肩高铁的世界级领先
  3. EMNLP 2020 | 基于超边融合的文本增强知识图谱开放域问答
  4. Halcon算子学习:find_surface_model
  5. ibiliplayer是什么_Bilibili视频播放页面接口整理(不定期更新)
  6. 显示器与服务器连接线叫什么,连接显示器和主机的线叫什么
  7. 怎么设置竖线分栏_做出专业级的Word文档分栏,只需这3个技巧
  8. 易语言模拟按键 c打不出,易语言怎么编写模拟按键
  9. 【转载】微信小程序中引入iconfont阿里矢量图库
  10. html怎么在手机打不开,手机的浏览器打不开网页怎么办
  11. 恒生杭州历年软件测试笔试题,【恒生电子软件测试面试】首先做一个笔试题,然...-看准网...
  12. php 后台实现订单支付成功后语音提示
  13. numpy 矩阵对角线_python – 使用numpy将矩阵更高的对角线清零
  14. 栅格布局 xs sm md lg
  15. [SSM框架]—Spring入门
  16. Python-在线网页导出为图片或pdf
  17. python3文件读写实例_2.2.3.1Python-实例---文件读写
  18. Caché 23种设计模式
  19. .then()方法的意思和用法
  20. ljd-2008+下载式多功能实验开发系统_运动控制模型仿真实验平台(YXMCP-ATCA-150)...

热门文章

  1. 对接币安接口的心得体会
  2. windows 下 netsh 实现 端口映射(端口转发)
  3. 触底加载MintUI
  4. excel填充序列_EXCEL里如何快速填充成千上万个序号呢?
  5. 永别了!我可爱的小小灰。。。
  6. 区块链100讲:能够证明你是你的数字签名和多重签名
  7. 一文读懂期货相关性分析
  8. EXCEL图片批量操作
  9. word中分栏后文字均匀的分布在了左右两栏,而不是填满左栏再填右栏,怎么办?
  10. android 代码亮屏功能,Android Studio用代码唤醒手机屏幕并解锁