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-Plus
的Page
对象进行分页 -
支持
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;
}
三、运行效果
-
请求示例
GET http://localhost:8080/user/page?pageNum=1&pageSize=5&name=张三&status=1&sortBy=update_time&isAsc=false
-
返回结果
{"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 实现了一个支持 复杂条件查询 + 分页 + 动态排序 的用户查询功能,适用于后台管理系统中的通用分页场景。
关键点总结:
-
使用
Page.of()
构建分页条件 -
用
lambdaQuery()
拼接查询条件 -
支持动态排序(
sortBy
+isAsc
) -
封装成统一分页结果
PageDTO
,方便前端使用
这样一来,前端就可以根据需要灵活查询用户数据。