如何用Spring Boot整合MyBatis实现高效分页查询?

2026-05-22 12:452阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1152个文字,预计阅读时间需要5分钟。

如何用Spring Boot整合MyBatis实现高效分页查询?

原文链接:https://www.jianshu.com/p/5f15474ac4c5

1. 在pom.xml文件中添加分页插件依赖包: xml com.github.pagehelper pagehelper-spring-boot-starter 1.2.5

原文链接:www.jianshu.com/p/5f15474ac4c5

1.在 pom.xml 文件中添加分页插件依赖包

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

2.application.yml 配置文件中添加分页插件有关的配置

pagehelper: helperDialect: mysql reasonable: true supportMethodsArguments: true params: count=countSql

3.编写分页代码
1)DAO层添加selectPage方法

package com.zgjy.dao; import com.zgjy.entity.SysUser; import com.zgjy.entity.OrderInfo; import com.zgjy.entity.orderInfoExample; import java.util.List; import org.apache.ibatis.annotations.Param; public interface OrderInfoMapper { int countByExample(orderInfoExample example); int deleteByExample(orderInfoExample example); int insert(OrderInfo record); int insertSelective(OrderInfo record); List<OrderInfo> selectByExample(orderInfoExample example); int updateByExampleSelective(@Param("record") OrderInfo record, @Param("example") orderInfoExample example); int updateByExample(@Param("record") OrderInfo record, @Param("example") orderInfoExample example); /** * 查询全部订单 * @return */ List<OrderInfo> selectAll(); /** * 分页查询订单 * @return */ List<OrderInfo> selectPage(); }

2)OrderInfoMapper.xml 中加入selectPage的实现

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

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

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

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

如何用Spring Boot整合MyBatis实现高效分页查询?

package com.zgjy.service.impl; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.zgjy.dao.OrderInfoMapper; import com.zgjy.entity.OrderInfo; import com.zgjy.entity.SysUser; import com.zgjy.service.OrderInfoService; import com.zgjy.util.PageRequest; import com.zgjy.util.PageResult; import com.zgjy.util.PageUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @Service public class OrderInfoServiceImpl implements OrderInfoService { @Autowired private OrderInfoMapper orderInfoMapper; @Override public List<OrderInfo> findAll() { return orderInfoMapper.selectAll(); } @Override public PageResult findPage(PageRequest pageRequest) { return PageUtils.getPageResult(pageRequest,getPageInfo(pageRequest)); } /** * 调用分页插件完成分页 * @param pageRequest * @return */ private PageInfo<?> getPageInfo(PageRequest pageRequest) { int pageNum = pageRequest.getPageNum(); int pageSize = pageRequest.getPageSize(); PageHelper.startPage(pageNum,pageSize); List<OrderInfo> sysMenus = orderInfoMapper.selectPage(); return new PageInfo<>(sysMenus); } }

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

package com.zgjy.controller; import com.zgjy.service.OrderInfoService; import com.zgjy.util.PageRequest; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("order") public class OrderInfoController { @Autowired private OrderInfoService orderInfoService; @GetMapping(value = "findAll") public Object findAll(){ return orderInfoService.findAll(); } @PostMapping(value="/findPage") public Object findPage(@RequestBody PageRequest pageQuery) { return orderInfoService.findPage(pageQuery); } }

分页查询请求封装类。
PageRequest.java

package com.zgjy.util; import lombok.Getter; import lombok.Setter; /** * 分页请求 */ @Setter @Getter public class PageRequest { /** * 当前页码 */ private int pageNum; /** * 每页数量 */ private int pageSize; }

分页查询结果封装类。
PageResult.java

package com.zgjy.util; import lombok.Getter; import lombok.Setter; import java.util.List; @Setter @Getter public class PageResult { /** * 当前页码 */ private int pageNum; /** * 每页数量 */ private int pageSize; /** * 记录总数 */ private long totalSize; /** * 页码总数 */ private int totalPages; /** * 数据模型 */ private List<?> content; }

分页查询相关工具类。
PageUtils.java

package com.zgjy.util; import com.github.pagehelper.PageInfo; public class PageUtils { /** * 将分页信息封装到统一的接口 * @param pageRequest * @param pageInfo * @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; } }

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


参数:pageNum: 1, pageSize: 5

0人点赞 日记本

本文共计1152个文字,预计阅读时间需要5分钟。

如何用Spring Boot整合MyBatis实现高效分页查询?

原文链接:https://www.jianshu.com/p/5f15474ac4c5

1. 在pom.xml文件中添加分页插件依赖包: xml com.github.pagehelper pagehelper-spring-boot-starter 1.2.5

原文链接:www.jianshu.com/p/5f15474ac4c5

1.在 pom.xml 文件中添加分页插件依赖包

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

2.application.yml 配置文件中添加分页插件有关的配置

pagehelper: helperDialect: mysql reasonable: true supportMethodsArguments: true params: count=countSql

3.编写分页代码
1)DAO层添加selectPage方法

package com.zgjy.dao; import com.zgjy.entity.SysUser; import com.zgjy.entity.OrderInfo; import com.zgjy.entity.orderInfoExample; import java.util.List; import org.apache.ibatis.annotations.Param; public interface OrderInfoMapper { int countByExample(orderInfoExample example); int deleteByExample(orderInfoExample example); int insert(OrderInfo record); int insertSelective(OrderInfo record); List<OrderInfo> selectByExample(orderInfoExample example); int updateByExampleSelective(@Param("record") OrderInfo record, @Param("example") orderInfoExample example); int updateByExample(@Param("record") OrderInfo record, @Param("example") orderInfoExample example); /** * 查询全部订单 * @return */ List<OrderInfo> selectAll(); /** * 分页查询订单 * @return */ List<OrderInfo> selectPage(); }

2)OrderInfoMapper.xml 中加入selectPage的实现

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

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

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

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

如何用Spring Boot整合MyBatis实现高效分页查询?

package com.zgjy.service.impl; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.zgjy.dao.OrderInfoMapper; import com.zgjy.entity.OrderInfo; import com.zgjy.entity.SysUser; import com.zgjy.service.OrderInfoService; import com.zgjy.util.PageRequest; import com.zgjy.util.PageResult; import com.zgjy.util.PageUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @Service public class OrderInfoServiceImpl implements OrderInfoService { @Autowired private OrderInfoMapper orderInfoMapper; @Override public List<OrderInfo> findAll() { return orderInfoMapper.selectAll(); } @Override public PageResult findPage(PageRequest pageRequest) { return PageUtils.getPageResult(pageRequest,getPageInfo(pageRequest)); } /** * 调用分页插件完成分页 * @param pageRequest * @return */ private PageInfo<?> getPageInfo(PageRequest pageRequest) { int pageNum = pageRequest.getPageNum(); int pageSize = pageRequest.getPageSize(); PageHelper.startPage(pageNum,pageSize); List<OrderInfo> sysMenus = orderInfoMapper.selectPage(); return new PageInfo<>(sysMenus); } }

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

package com.zgjy.controller; import com.zgjy.service.OrderInfoService; import com.zgjy.util.PageRequest; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("order") public class OrderInfoController { @Autowired private OrderInfoService orderInfoService; @GetMapping(value = "findAll") public Object findAll(){ return orderInfoService.findAll(); } @PostMapping(value="/findPage") public Object findPage(@RequestBody PageRequest pageQuery) { return orderInfoService.findPage(pageQuery); } }

分页查询请求封装类。
PageRequest.java

package com.zgjy.util; import lombok.Getter; import lombok.Setter; /** * 分页请求 */ @Setter @Getter public class PageRequest { /** * 当前页码 */ private int pageNum; /** * 每页数量 */ private int pageSize; }

分页查询结果封装类。
PageResult.java

package com.zgjy.util; import lombok.Getter; import lombok.Setter; import java.util.List; @Setter @Getter public class PageResult { /** * 当前页码 */ private int pageNum; /** * 每页数量 */ private int pageSize; /** * 记录总数 */ private long totalSize; /** * 页码总数 */ private int totalPages; /** * 数据模型 */ private List<?> content; }

分页查询相关工具类。
PageUtils.java

package com.zgjy.util; import com.github.pagehelper.PageInfo; public class PageUtils { /** * 将分页信息封装到统一的接口 * @param pageRequest * @param pageInfo * @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; } }

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


参数:pageNum: 1, pageSize: 5

0人点赞 日记本