首页 > 其他分享 >SpringBoot中使用PageHelper插件实现Mybatis分页

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

时间:2024-02-20 14:33:35浏览次数:29  
标签:插件 SpringBoot spring boot userMapper PageHelper org pagehelper

场景

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

        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.1</version>
        </dependency>

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

https://github.com/pagehelper/Mybatis-PageHelper

官方使用教程:

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

 

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

https://github.com/pagehelper/pagehelper-spring-boot

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

注:

博客:
https://blog.csdn.net/badao_liumang_qizhi

实现

1、项目中添加依赖

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

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

 

完整pom依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>
        <!--MySQL驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>1.3.0</version>
        </dependency>

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

spring:
  main:
    allow-circular-references: true

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

 

yml中添加如下配置

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

 

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

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

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

官方文档给出了多种用法

//第一种,RowBounds方式的调用
List<User> list = sqlSession.selectList("x.y.selectIf", null, new RowBounds(0, 10));

//第二种,Mapper接口方式的调用,推荐这种使用方式。
PageHelper.startPage(1, 10);
List<User> list = userMapper.selectIf(1);

//第三种,Mapper接口方式的调用,推荐这种使用方式。
PageHelper.offsetPage(1, 10);
List<User> list = userMapper.selectIf(1);

//第四种,参数方法调用
//存在以下 Mapper 接口方法,你不需要在 xml 处理后两个参数
public interface CountryMapper {
    List<User> selectByPageNumSize(
            @Param("user") User user,
            @Param("pageNum") int pageNum,
            @Param("pageSize") int pageSize);
}
//配置supportMethodsArguments=true
//在代码中直接调用:
List<User> list = userMapper.selectByPageNumSize(user, 1, 10);

//第五种,参数对象
//如果 pageNum 和 pageSize 存在于 User 对象中,只要参数有值,也会被分页
//有如下 User 对象
public class User {
    //其他fields
    //下面两个参数名和 params 配置的名字一致
    private Integer pageNum;
    private Integer pageSize;
}
//存在以下 Mapper 接口方法,你不需要在 xml 处理后两个参数
public interface CountryMapper {
    List<User> selectByPageNumSize(User user);
}
//当 user 中的 pageNum!= null && pageSize!= null 时,会自动分页
List<User> list = userMapper.selectByPageNumSize(user);

//第六种,ISelect 接口方式
//jdk6,7用法,创建接口
Page<User> page = PageHelper.startPage(1, 10).doSelectPage(new ISelect() {
    @Override
    public void doSelect() {
        userMapper.selectGroupBy();
    }
});
//jdk8 lambda用法
Page<User> page = PageHelper.startPage(1, 10).doSelectPage(()-> userMapper.selectGroupBy());

//也可以直接返回PageInfo,注意doSelectPageInfo方法和doSelectPage
pageInfo = PageHelper.startPage(1, 10).doSelectPageInfo(new ISelect() {
    @Override
    public void doSelect() {
        userMapper.selectGroupBy();
    }
});
//对应的lambda用法
pageInfo = PageHelper.startPage(1, 10).doSelectPageInfo(() -> userMapper.selectGroupBy());

//count查询,返回一个查询语句的count数
long total = PageHelper.count(new ISelect() {
    @Override
    public void doSelect() {
        userMapper.selectLike(user);
    }
});
//lambda
        total=PageHelper.count(()->userMapper.selectLike(user));

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

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

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

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

编写单元测试

import com.badao.demo.entity.User;
import com.badao.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;

@SpringBootTest
@RunWith(SpringRunner.class)
public class PageTest {

    @Autowired
    private UserService userService;

    @Test
    public void testPage() {
        List<User> users = userService.selectUserPage();
        System.out.println(users.size());
    }

}

单元测试运行结果

 

标签:插件,SpringBoot,spring,boot,userMapper,PageHelper,org,pagehelper
From: https://www.cnblogs.com/badaoliumangqizhi/p/18023014

相关文章

  • 编程开发 --- springboot参考文档之概述
    该文档来自于官方,本人只是翻译通顺、忽略废话、术语通俗解释、代码注释等优化工作,目的只是让我们更快的理解它。https://github.com/spring-projects/spring-boot/wiki   第一章法律版权声明  spring.io ©2012-2024您可以复制本文件供自己使用或分发给他人,但不得......
  • 使用油猴插件,修改和简化美化博客园的随笔编辑界面
    包含内容开局自动打开实时预览编辑区域高度放大左侧菜单栏区域缩小下方菜单栏隐藏,点击恢复可再现待续//==UserScript==//@name博客园修改//@namespacehttp://tampermonkey.net///@version2024-02-20//@descriptiontrytotakeover......
  • 从0到1设计开发Chrome插件
    TNTWeb-全称腾讯新闻中台前端团队,组内小伙伴在Web前端、NodeJS开发、UI设计、移动APP等大前端领域都有所实践和积累。目前团队主要支持腾讯新闻各业务的前端开发,业务开发之余也积累沉淀了一些前端基础设施,赋能业务提效和产品创新。团队倡导开源共建,拥有各种技术大牛,团队Githu......
  • 基于Java+SpringBoot+vue的采购管理系统(源码及功能分析)
    前言:随着全球化和信息化的发展,企业采购管理面临越来越多的挑战。传统的采购方式往往涉及到多个繁琐的步骤,包括供应商筛选、询价、招投标等,这些过程不仅耗时,而且容易出错。为了解决这些问题,供应商、询价、招投标一体化系统应运而生。该系统通过集成供应商管理、询价管理、招投标......
  • Babel 插件种类
    Babel插件种类:语法插件(SyntaxPlugins):语法插件负责扩展Babel的解析器,使其能够理解和解析新的或实验性的JavaScript语法特性。它们并不直接对代码进行转换,只是开启对应语法的解析功能。这意味着,如果没有相应的语法插件,Babel将无法正确解析某些新的或实验性的JavaScri......
  • springboot整合activiti工作流(源码及功能分析)
    前言activiti工作流引擎项目,企业erp、oa、hr、crm等企事业办公系统轻松落地,一套完整并且实际运用在多套项目中的案例,满足日常业务流程审批需求。一、项目形式springboot+vue+activiti集成了activiti在线编辑器,流行的前后端分离部署开发模式,快速开发平台,可插拔工作流服务。工作......
  • SpringBoot 实现热插拔AOP,非常实用!
    现在有这么一个需求:就是我们日志的开与关是交给使用人员来控制的,而不是由我们开发人员固定写死的。大家都知道可以用aop来实现日志管理,但是如何动态的来实现日志管理呢?aop源码中的实现逻辑中有这么一个步骤,就是会依次扫描Advice的实现类,然后执行。我们要做的就是自定义一个advice......
  • 磐维2.0 之pg_stat_statements插件
    目录一、概念描述二、安装插件三、pg_stat_statements视图四、pg_stat_statements相关参数五、测试验证一、概念描述pg_stat_statements是pg的一个扩展插件,通常用于统计数据库的资源开销,分析TOPSQL,找出慢查询。二、安装插件testdb=#testdb=#createextensionpg_stat_sta......
  • postman也不行!IDEA接口调试插件
    Postman是大家最常用的API调试工具,那么有没有一种方法可以不用手动写入接口到Postman,即可进行接口调试操作?今天给大家推荐一款IDEA插件:ApipostHelper,写完代码就可以调试接口并一键生成接口文档!而且还可以根据已有的方法帮助您快速生成url和params。更重要的是他完全免费!Apipos......
  • 旁门左道:借助 HttpClientHandler 拦截请求,体验 Semantic Kernel 插件
    前天尝试通过one-api+dashscope(阿里云灵积)+qwen(通义千问)运行SemanticKernel插件(Plugin),结果尝试失败,详见前天的博文。今天换一种方式尝试,选择了一个旁门左道走走看,看能不能在不使用大模型的情况下让SemanticKernel插件运行起来,这个旁门左道就是从StephenToub那......