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

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.dtcms.com/a/364180.html

相关文章:

  • TNNLS-2025《Metric Learning-Based Subspace Clustering》
  • 实训云上搭建分布式Hadoop集群[2025] 实战笔记
  • 图像编码--监控摄像机QP设置大小?
  • 构建可扩展的 AI 应用:LangChain 与 MCP 服务的集成模式
  • 用 map() + reduce() 搞定咖啡店订单结算:从发票到报表的 Python 实战
  • C19T1
  • leetcode567.字符串的排列
  • 2025 年行政岗转型突破:解锁技能提升新方向
  • 数据集格式化内容提要解析 (70)
  • Base64编码的作用与应用场景
  • SpringBoot 事务管理避坑指南
  • GitLens VS Code插件测评:助力代码协作高效查提交记录,轻松解决分支管理与代码冲突
  • RestTemplate 连接池怎么合理的使用
  • YOLOv8改进有效系列大全:从卷积到检测头的百种创新机制解析
  • 【邀请函】代码四合院,静候君至 | GitCodeAI社区升级发布会
  • ELF文件格式解析
  • 【代码随想录day 22】 力扣 131.分割回文串
  • 数据结构——树(03二叉树,与路径有关的问题,代码练习)
  • MySQL-表的约束(上)
  • 英伟达Jetson Orin NX-YOLOv8s目标检测模型耗时分析
  • 写论文先卡骨架再卡内容?一周出初稿爽翻!AI 帮我把骨架搭得明明白白,填内容超顺
  • 零样本视觉模型(DINOv3)
  • 从静态到智能:用函数式接口替代传统工具类
  • 作物改良中的综合生物技术与人工智能创新--文献精读160
  • github添加SSH密钥
  • 使用 Python 的 SymPy 进行符号计算
  • XMind2025(思维导图)下载安装教程
  • Linux 内核定时器实验
  • 2025年IT行业大学生证书选择指南
  • 机器学习:从技术原理到实践应用的深度解析