• SpringBoot中使用PageHelper插件实现Mybatis分页


    场景

    SpringBoot中整合Mybatis时一般添加的依赖为

    1.         <dependency>
    2.             <groupId>org.mybatis.spring.boot</groupId>
    3.             <artifactId>mybatis-spring-boot-starter</artifactId>
    4.             <version>2.2.1</version>
    5.         </dependency>

    如果要实现分页查询的话,可以使用Mybatis的分页插件PageHelper

    GitHub - pagehelper/Mybatis-PageHelper: Mybatis通用分页插件

    官方使用教程:

    https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/zh/HowToUse.md

    这里是SpringBoot项目,可直接使用pagehelper-spring-boot-starter

    GitHub - pagehelper/pagehelper-spring-boot: pagehelper-spring-boot

    PageHelper-Spring-Boot-Starter 帮助你集成分页插件到 Spring Boot

    注:

    博客:
    霸道流氓气质-CSDN博客

    实现

    1、项目中添加依赖

    1.         <dependency>
    2.             <groupId>com.github.pagehelper</groupId>
    3.             <artifactId>pagehelper-spring-boot-starter</artifactId>
    4.             <version>1.3.0</version>
    5.         </dependency>

    添加这一个依赖就够了,不用再引入mybatis的依赖,因为会自动引入多个依赖

    完整pom依赖

    1.         <dependency>
    2.             <groupId>org.springframework.boot</groupId>
    3.             <artifactId>spring-boot-starter-web</artifactId>
    4.         </dependency>
    5.         <dependency>
    6.             <groupId>com.mysql</groupId>
    7.             <artifactId>mysql-connector-j</artifactId>
    8.             <scope>runtime</scope>
    9.         </dependency>
    10.         <dependency>
    11.             <groupId>org.projectlombok</groupId>
    12.             <artifactId>lombok</artifactId>
    13.             <optional>true</optional>
    14.         </dependency>
    15.         <dependency>
    16.             <groupId>org.springframework.boot</groupId>
    17.             <artifactId>spring-boot-starter-test</artifactId>
    18.             <scope>test</scope>
    19.         </dependency>
    20.         <dependency>
    21.             <groupId>junit</groupId>
    22.             <artifactId>junit</artifactId>
    23.         </dependency>
    24.         <!--MySQL驱动-->
    25.         <dependency>
    26.             <groupId>mysql</groupId>
    27.             <artifactId>mysql-connector-java</artifactId>
    28.         </dependency>
    29.         <dependency>
    30.             <groupId>com.github.pagehelper</groupId>
    31.             <artifactId>pagehelper-spring-boot-starter</artifactId>
    32.             <version>1.3.0</version>
    33.         </dependency>

    这里spring-boot-starter-web引入2.6.13,且存在循环引入,为避免循环依赖引用报错,添加如下配置

    1. spring:
    2.   main:
    3.     allow-circular-references: true

    2、按照官方文档说明配置PageHelper

    yml中添加如下配置

    1. pagehelper:
    2. helperDialect: mysql # 指定数据库,不指定的话会默认自动检测数据库类型
    3. # 是否启用分页合理化。
    4. # 如果启用,当pagenum<1时,会自动查询第一页的数据,当pagenum>pages时,自动查询最后一页数据;
    5. # 不启用的,以上两种情况都会返回空数据
    6. reasonable: true
    7. # 是否开启自动分页? 分页插件会从查询方法的参数值中,自动 params 配置的字段中取值,查找到合适的值时就会自动分页。
    8. supportMethodsArguments: true # 默认值false
    9. # 用于从对象中根据属性名取值, 可以配置 pageNum,pageSize,count,pageSizeZero,reasonable,
    10. # 不配置映射的用默认值, 默认值为pageNum=pageNum;pageSize=pageSize;count=countSql;
    11. params: count=countSql

    3、yml中同样添加mybatis的配置

    1. mybatis:
    2.   mapper-locations: classpath:mapper/*.xml    # mapper映射文件位置
    3.   type-aliases-package: com.badao.demo.entity    # 实体类所在的位置
    4.   configuration:
    5.     log-impl: org.apache.ibatis.logging.stdout.StdOutImpl   #用于控制台打印sql语句

    4、如何在代码中使用分页

    官方文档给出了多种用法

    1. //第一种,RowBounds方式的调用
    2. List<User> list = sqlSession.selectList("x.y.selectIf", null, new RowBounds(0, 10));
    3. //第二种,Mapper接口方式的调用,推荐这种使用方式。
    4. PageHelper.startPage(1, 10);
    5. List<User> list = userMapper.selectIf(1);
    6. //第三种,Mapper接口方式的调用,推荐这种使用方式。
    7. PageHelper.offsetPage(1, 10);
    8. List<User> list = userMapper.selectIf(1);
    9. //第四种,参数方法调用
    10. //存在以下 Mapper 接口方法,你不需要在 xml 处理后两个参数
    11. public interface CountryMapper {
    12.     List<User> selectByPageNumSize(
    13.             @Param("user") User user,
    14.             @Param("pageNum") int pageNum,
    15.             @Param("pageSize") int pageSize);
    16. }
    17. //配置supportMethodsArguments=true
    18. //在代码中直接调用:
    19. List<User> list = userMapper.selectByPageNumSize(user, 1, 10);
    20. //第五种,参数对象
    21. //如果 pageNum 和 pageSize 存在于 User 对象中,只要参数有值,也会被分页
    22. //有如下 User 对象
    23. public class User {
    24.     //其他fields
    25.     //下面两个参数名和 params 配置的名字一致
    26.     private Integer pageNum;
    27.     private Integer pageSize;
    28. }
    29. //存在以下 Mapper 接口方法,你不需要在 xml 处理后两个参数
    30. public interface CountryMapper {
    31.     List<User> selectByPageNumSize(User user);
    32. }
    33. //当 user 中的 pageNum!= null && pageSize!= null 时,会自动分页
    34. List<User> list = userMapper.selectByPageNumSize(user);
    35. //第六种,ISelect 接口方式
    36. //jdk6,7用法,创建接口
    37. Page<User> page = PageHelper.startPage(1, 10).doSelectPage(new ISelect() {
    38.     @Override
    39.     public void doSelect() {
    40.         userMapper.selectGroupBy();
    41.     }
    42. });
    43. //jdk8 lambda用法
    44. Page<User> page = PageHelper.startPage(1, 10).doSelectPage(()-> userMapper.selectGroupBy());
    45. //也可以直接返回PageInfo,注意doSelectPageInfo方法和doSelectPage
    46. pageInfo = PageHelper.startPage(1, 10).doSelectPageInfo(new ISelect() {
    47.     @Override
    48.     public void doSelect() {
    49.         userMapper.selectGroupBy();
    50.     }
    51. });
    52. //对应的lambda用法
    53. pageInfo = PageHelper.startPage(1, 10).doSelectPageInfo(() -> userMapper.selectGroupBy());
    54. //count查询,返回一个查询语句的count
    55. long total = PageHelper.count(new ISelect() {
    56.     @Override
    57.     public void doSelect() {
    58.         userMapper.selectLike(user);
    59.     }
    60. });
    61. //lambda
    62.         total=PageHelper.count(()->userMapper.selectLike(user));

    下面介绍简单的PageHelper.startPage 静态方法调用

    你需要进行分页的 MyBatis 查询方法前调用 PageHelper.startPage 静态方法即可,

    紧跟在这个方法后的第一个MyBatis 查询方法会被进行分页。

    1.     @Override
    2.     public List<User> selectUserPage() {
    3.         PageHelper.startPage(1, 10);
    4.         return userMapper.findAll();
    5.     }

    编写单元测试

    1. import com.badao.demo.entity.User;
    2. import com.badao.demo.service.UserService;
    3. import org.springframework.beans.factory.annotation.Autowired;
    4. import org.junit.Test;
    5. import org.junit.runner.RunWith;
    6. import org.springframework.boot.test.context.SpringBootTest;
    7. import org.springframework.test.context.junit4.SpringRunner;
    8. import java.util.List;
    9. @SpringBootTest
    10. @RunWith(SpringRunner.class)
    11. public class PageTest {
    12.     @Autowired
    13.     private UserService userService;
    14.     @Test
    15.     public void testPage() {
    16.         List users = userService.selectUserPage();
    17.         System.out.println(users.size());
    18.     }
    19. }

    单元测试运行结果

  • 相关阅读:
    继承-安全-设计模式
    Python生成二维码
    2023年第六届先进控制,自动化与机器人国际会议(ICACAR 2023)
    ChatGPT辅助下的小组学习
    使用QT的QML实时显示海康威视网络摄像头的视频数据
    TCP 三次握手的原因是什么?
    css3的attr函数使用,加载unicode矢量图标
    Topic 19. 临床预测模型之输出每个患者列线图得分 (nomogramFormula)
    我的企业证书是正常的但是下载应用app到手机提示无法安装“app名字”无法安装此app,因为无法验证其完整性解决方案
    数据挖掘实验一
  • 原文地址:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/136189442