当前位置: 首页 > java >正文

MyBatis-Plus 实现用户分页查询(支持复杂条件)

目录

一、功能介绍

二、代码实现

1. 控制层 UserController.java

2. 服务层接口 IUserService.java

3. 服务层实现 UserServiceImpl.java

4. 查询条件封装 UserQuery.java

5. 分页结果封装 PageDTO.java

6. 统一返回结果 Result.java

7. 用户展示对象 UserVO.java

三、运行效果

四、总结


在后台管理系统中,分页查询用户信息是非常常见的需求。本篇文章将带你一步一步实现一个支持复杂条件筛选和排序的用户分页查询功能,并返回自定义的分页结果对象。


一、功能介绍

本文实现的功能如下:

  • 支持分页查询用户信息

  • 可根据 用户名状态 等条件过滤

  • 支持动态排序(前端可传入排序字段和升降序)

  • 返回 统一分页结果(包含总数、总页数、数据列表)

效果图如下:

✅ 查询结果包含用户列表,并带有分页信息,前端调用时可以自由指定条件和排序方式。


二、代码实现

下面我们分文件展示完整代码。


1. 控制层 UserController.java

package com.example.controller;import com.example.dto.PageDTO;
import com.example.dto.Result;
import com.example.dto.UserQuery;
import com.example.vo.UserVO;
import com.example.service.IUserService;
import io.swagger.v3.oas.annotations.Operation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {private final IUserService iUserService;public UserController(IUserService iUserService) {this.iUserService = iUserService;}@Operation(description = "根据复杂条件分页查询用户")@GetMapping("/page")public Result<PageDTO<UserVO>> queryUserPage(UserQuery query){log.info("根据复杂条件分页查询用户:{}", query);PageDTO<UserVO> result = iUserService.queryUserPage(query);return Result.success(result);}
}

说明:

  • 这里提供了一个 /user/page 接口

  • 入参是 UserQuery(封装了分页参数和查询条件)

  • 返回统一的 Result<PageDTO<UserVO>>


2. 服务层接口 IUserService.java

package com.example.service;import com.example.dto.PageDTO;
import com.example.dto.UserQuery;
import com.example.vo.UserVO;public interface IUserService {// 根据复杂条件分页查询用户PageDTO<UserVO> queryUserPage(UserQuery query);}

3. 服务层实现 UserServiceImpl.java

package com.example.service.impl;import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.dto.PageDTO;
import com.example.dto.UserQuery;
import com.example.entity.User;
import com.example.mapper.UserMapper;
import com.example.service.IUserService;
import com.example.vo.UserVO;
import org.springframework.stereotype.Service;import java.util.Collections;
import java.util.List;@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {// 根据复杂条件分页查询用户@Overridepublic PageDTO<UserVO> queryUserPage(UserQuery query) {String name = query.getName();Integer status = query.getStatus();// 1.构建分页条件Page<User> page = Page.of(query.getPageNum(), query.getPageSize());if (StrUtil.isNotBlank(query.getSortBy())) {// 指定排序字段page.addOrder(new OrderItem(query.getSortBy(), query.getIsAsc()));} else {// 默认按照更新时间倒序page.addOrder(new OrderItem("update_time", false));}// 2.分页查询Page<User> p = lambdaQuery().like(name != null, User::getUsername, name).eq(status != null, User::getStatus, status).page(page);// 3.封装 VO 结果PageDTO<UserVO> dto = new PageDTO<>();dto.setTotal(p.getTotal());dto.setPages(p.getPages());List<User> records = p.getRecords();if (records == null) {dto.setList(Collections.emptyList());} else {List<UserVO> userVOList = BeanUtil.copyToList(records, UserVO.class);dto.setList(userVOList);}// 4.返回结果return dto;}
}

说明:

  • 使用 MyBatis-PlusPage 对象进行分页

  • 支持 like 模糊查询、eq 精确匹配

  • 支持动态排序字段(前端可传 sortBy

  • 最终返回一个 PageDTO<UserVO>


4. 查询条件封装 UserQuery.java

package com.example.dto;import lombok.Data;@Data
public class UserQuery {private String name;       // 用户名private Integer status;    // 状态(0-禁用 1-启用)private Integer pageNum = 1;   // 当前页private Integer pageSize = 10; // 每页大小private String sortBy;     // 排序字段private Boolean isAsc = true;  // 是否升序
}

5. 分页结果封装 PageDTO.java

package com.example.dto;import lombok.Data;
import java.util.List;@Data
public class PageDTO<T> {private Long total;     // 总条数private Long pages;     // 总页数private List<T> list;   // 当前页数据
}

6. 统一返回结果 Result.java

package com.example.dto;import lombok.Data;@Data
public class Result<T> {private Integer code;private String message;private T data;public static <T> Result<T> success(T data){Result<T> r = new Result<>();r.setCode(200);r.setMessage("操作成功");r.setData(data);return r;}public static <T> Result<T> fail(String message){Result<T> r = new Result<>();r.setCode(500);r.setMessage(message);return r;}
}

7. 用户展示对象 UserVO.java

package com.example.vo;import lombok.Data;@Data
public class UserVO {private Long id;private String username;private Integer status;private String updateTime;
}

三、运行效果

  1. 请求示例

GET http://localhost:8080/user/page?pageNum=1&pageSize=5&name=张三&status=1&sortBy=update_time&isAsc=false
  1. 返回结果

{"code": 200,"message": "操作成功","data": {"total": 12,"pages": 3,"list": [{"id": 1,"username": "张三","status": 1,"updateTime": "2025-09-01 12:00:00"},{"id": 2,"username": "李四","status": 1,"updateTime": "2025-08-30 18:30:00"}]}
}

四、总结

本文基于 SpringBoot + MyBatis-Plus 实现了一个支持 复杂条件查询 + 分页 + 动态排序 的用户查询功能,适用于后台管理系统中的通用分页场景。

关键点总结:

  1. 使用 Page.of() 构建分页条件

  2. lambdaQuery() 拼接查询条件

  3. 支持动态排序(sortBy + isAsc

  4. 封装成统一分页结果 PageDTO,方便前端使用

这样一来,前端就可以根据需要灵活查询用户数据。

http://www.xdnf.cn/news/19697.html

相关文章:

  • Ansible循环与判断实战指南
  • SQL Server--提取性能最差的查询
  • Redisson分布式锁会发生死锁问题吗?怎么发生的?
  • 嵌入式系统与51单片机全解析
  • 20.Linux进程信号(一)
  • 深入浅出 RabbitMQ - SpringBoot2.X整合RabbitMQ实战
  • 数据结构——顺序表和单向链表(1)
  • WPF 开发必备技巧:TreeView 自动展开全攻略
  • 豪华酒店品牌自营APP差异对比分析到产品重构
  • Qt6实现绘图工具:12种绘图工具全家桶!这个项目满足全部2D场景
  • 国产化部署的it运维平台:功能全面,操作便捷
  • OpenCV Python
  • 新手也能轻松选!秒出PPT和豆包AI PPT优缺点解析
  • 《Python Flask 实战:构建一个可交互的 Web 应用,从用户输入到智能响应》
  • 企业如何实现零工用工零风险?盖雅全自动化合规管控
  • 2024 年 AI 产业格局复盘:头部企业竞逐方向与中小玩家生存破局点
  • K8s HPA自动扩缩容实战指南
  • 广东某地非金属矿山自动化监测服务项目
  • Android 16k页面大小适配
  • Rust SQLx 开发指南:利用 Tokio 进行性能优化
  • VUE基础
  • 代码随想录---动态规划篇
  • 机器学习辅助的Backtrader资产配置优化策略
  • 人脸识别在智能安防中的实践路径
  • nodejs文件读写操作完整版
  • 国标落地!中小学生午休课桌椅迎来规范,聚焦舒适与耐用
  • 2025年十大主流HR管理系统全面评测:功能、价格、适用场景完整对比
  • C++ 中类模板参数的使用详解
  • webpack打包优化都有哪些
  • PromptHunt- 简单易用的AI提示词网站