news 2026/4/16 12:34:35

SpringBoot+Mybatis-plus实现分页查询(一看就会)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SpringBoot+Mybatis-plus实现分页查询(一看就会)

分页查询就是实现前端能进行翻页功能实现、查询功能实现等比如

这张图片里面搜索功能和底下翻页的功能、每页展示多少条数据的功能

都是由我们后端返回的参数 total、pages、records等前端接收实现的

意思是这些功能我们后端不仅要实现分页功能,前端接收我们返回的参数也要实现相对应的功能

后端只用返回查询结果和返回的total等字段

那么我们如何实现呢

首先,根据这张图,我们需要几个类

实体类 ,DTO,以及VO

这几个类来干嘛? DTO就是用来当形参的,VO就是来当返回信息的,实体类干嘛?先别急,听我说

根据这张图片,我们首先要实现对于人员姓名的模糊查询,手机号的查询,以及状态的查询

所以我们是不是就要传三个字段username、phone、status呢

是的,然后我们定义一个dto类

@Data @AllArgsConstructor @NoArgsConstructor @Api(tags = "用户查询列表") public class QueryUserDto extends PageDto { @ApiModelProperty(value = "账号") private String account; @ApiModelProperty(value = "用户姓名") private String accName; @ApiModelProperty(value = "手机号") private String accPhone; @ApiModelProperty(value = "是否启用(1:启用,0:停用)") private Integer isEnable; }

Api这些注解是用的swagger的,相当于是提示功能,这些都先不管,我们是不是定义好了几个需要传入的字段?ok ,那么我们刚刚说了既然是分页功能,是不是要由total、pageSize等字段呢

import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.NoArgsConstructor; import lombok.Setter; @Data @Setter @ApiModel(value = "分页对象" ,description = "分页查询实体") @NoArgsConstructor public class PageDto { @ApiModelProperty(value = "页码",required = true) private Integer PageNumber=1; @ApiModelProperty(value = "每页显示数量",required = true) private Integer PageSize=10; @ApiModelProperty("排序字段") private String sortBy; @ApiModelProperty("排序方式") private Boolean isAsc; }

这个就是我们需要传入的分页对象,可以说是一个查询的模板,大家可以保存下来,要分页的时候拿出来用就行了。我们刚刚定义的QueryUserDto继承这个pageDto,相当于pageDto是一个父类,但我们用的是QueryUserDto,在实际情况中,我们可以通过需要传入哪些字段进行查询来定义我们QueryUserDto里面的字段

然后是返回对象VO,我们刚刚提到前端需要我们返回给他们Total,pages,records等字段,VO里面就封装了这些字段,

import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.List; @Data public class PageVO<T> { @ApiModelProperty(value = "每页显示的条数") private Long size =10L; @ApiModelProperty(value = "当前页") private Long current=1L; @ApiModelProperty(value = "总条数") private Long total; @ApiModelProperty(value = "总页数") private Long pages; @ApiModelProperty(value = "分页数据") private List<T> records; }

这里面就封装了前端需要的字段,每次返回给前端都会默认有这些字段,这也是一个模板,大家可以保存起来

然后就是具体的实现方法,首先就是mybatis-plus的分页插件

import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import org.mybatis.spring.annotation.MapperScan; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class MyBatisConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor(){ MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; } }

这个就是mybatis-plus提供的分页插件功能,我们配置好后进入下一步

创建相关的service接口类

里面的方法暂且可以不管,看PageUser这个方法

然后实现类serviceImpl

@Override public R<?> PageUser(QueryUserDto queryUserDto) { Page<AccountInfo> userPage = new Page<>(queryUserDto.getPageNumber(), queryUserDto.getPageSize()); LambdaQueryWrapper<AccountInfo> queryWrapper =new LambdaQueryWrapper<>(); if(queryUserDto.getIsEnable()!=null){ queryWrapper.eq(AccountInfo::getIsEnable,queryUserDto.getIsEnable()); } String accName=queryUserDto.getAccName(); if (StringUtils.isNotBlank(accName)){ accName=accName.trim(); queryWrapper.like(AccountInfo::getAccName,accName); } String accPhone=queryUserDto.getAccPhone(); if (StringUtils.isNotBlank(accPhone)){ accPhone=accPhone.trim(); queryWrapper.like(AccountInfo::getAccPhone,accPhone); } String account=queryUserDto.getAccount(); if (StringUtils.isNotBlank(account)){ account=account.trim(); queryWrapper.like(AccountInfo::getAccount,account); } Page<AccountInfo> page = page(userPage,queryWrapper); PageVO<AccountInfo> userPageVO = new PageVO<>(); BeanUtils.copyProperties(page,userPageVO); return R.Success("查询成功",userPageVO); }

关于形参我在上面讲到过,我们不用pageDto实现,而是用他的子类QueryUserDto来实现,因为是继承关系,所以我们传入他的子类QueryUserDto。

我们看起来这个代码很复杂,其实我们可以分成三个板块看就很清晰结构了

第一个

    • 这部分声明了一个Page类型的变量userPagePage是MyBatis-Plus中用于分页查询的类。
    • <AccountInfo>是泛型参数,表示这个分页查询将会返回AccountInfo类型的对象列表。AccountInfo是一个自定义的Java类,通常代表了某种数据库表的结构。
  1. new Page<>(queryUserDto.getPageNumber(), queryUserDto.getPageSize());

    • 这部分通过new Page<>()构造函数创建了一个Page实例。
    • queryUserDto是一个数据传输对象(DTO),通常用于封装从前端传递到后端的请求参数。在这个上下文中,它封装了分页查询所需的页码和每页大小。
    • queryUserDto.getPageNumber()获取请求中的页码(通常是从1开始的整数)。页码指定了用户想要查看哪一页的数据。
    • queryUserDto.getPageSize()获取请求中的每页大小,即每页应该显示多少条数据。

第二个

这部分代码是通过mybatis-plus中的Lambada来构造查询条件,作用就是人员姓名模糊查询、状态查询、手机号查询,trim()是来设置去除传入参数的空格的,以便前端输入带有空格的数据时查询不出来

第三个

调用page方法,传入分页信息(userPage)和查询条件(queryWrapper),然后返回一个包含查询结果和分页信息的Page<AccountInfo>对象。

然后创建VO对象的实例,通过BeanUtils工具类将查询出来的对象复制给VO对象,这就是VO的作用,用于返回信息

运行效果

总结

首先我们需要引入分页插件配置,然后创建DTO和VO,DTO包含我们需要的进行查询的字段,继承PageDto,VO是返回信息的对象,这样做不会影响我们创建的实体类。

接下来就是service接口和serviceImpl实现类的创建,在实现类里面编写我们分页的逻辑

然后三部分结构,引入Page实例、查询语句编写、page方法进行查询并复制给VO对象用于返回信息

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/13 17:06:11

SpringBoot 项目如何使用 pageHelper 做分页处理 (含两种依赖方式)

分页是常见大型项目都需要的一个功能&#xff0c;PageHelper是一个非常流行的MyBatis分页插件&#xff0c;它支持多数据库分页&#xff0c;无需修改SQL语句即可实现分页功能。 本文在最后展示了两种依赖验证的结果。 文章目录 一、第一种依赖方式二、第二种依赖方式三、创建数…

作者头像 李华
网站建设 2026/4/12 20:20:47

发布-订阅模式:流处理架构中的瑞士军刀

你好&#xff0c;我是程序员贵哥。 今天我想要与你分享的是在处理大规模数据中十分流行的一种设计模式&#xff1a;发布/订阅模式&#xff08;Publish/Subscribe Pattern&#xff09;&#xff0c;有些地方也称它为Pub/Sub。 在了解发布/订阅模式之前&#xff0c;我想先简单介…

作者头像 李华
网站建设 2026/4/16 3:59:19

Keil5乱码问题排查:编码一致性核心要点

Keil5中文注释乱码&#xff1f;一文讲透编码根源与实战解决你有没有遇到过这样的场景&#xff1a;在Keil5里打开一个C文件&#xff0c;明明昨天还清清楚楚的“初始化GPIO引脚”&#xff0c;今天却变成了“鍒濆鍖朞PIO寮曡剼”&#xff1f;或者更离谱地显示成一堆方框、问号&a…

作者头像 李华
网站建设 2026/4/15 14:21:09

利用HAL库实现浮点数据转换示例

从ADC采样到真实世界&#xff1a;用HAL库搞定浮点转换的那些事 你有没有遇到过这样的场景&#xff1f; 接上一个温度传感器&#xff0c;读出来的数值明明是12位ADC原始值&#xff08;比如 3056 &#xff09;&#xff0c;但你想知道的是“现在室温到底是23.7℃还是24.1℃”。…

作者头像 李华
网站建设 2026/4/13 12:22:28

AI智能体进化:学习与MCP协议实战

智能体的“自我修炼”与“通用接口”&#xff1a;学习适应与MCP协议实战解析 在智能体从“被动执行”走向“主动智能”的进化中&#xff0c;“学习与适应”是其突破预设局限的核心能力&#xff0c;而“模型上下文协议&#xff08;MCP&#xff09;”则是其打通外部世界的关键桥梁…

作者头像 李华
网站建设 2026/4/15 21:33:57

vivado2018.3电源规划与IO标准配置:全面讲解

Vivado 2018.3 中的电源规划与 IO 配置实战&#xff1a;从原理到避坑指南你有没有遇到过这样的情况&#xff1f;FPGA 逻辑功能明明写得没问题&#xff0c;仿真也通过了&#xff0c;可一上板子——HDMI 黑屏、DDR 接口时序紊乱、系统运行几分钟就发热重启。排查一圈下来&#xf…

作者头像 李华