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

发布于:2025-09-04 ⋅ 阅读:(18) ⋅ 点赞:(0)

目录

一、功能介绍

二、代码实现

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 {

    // 根据复杂条件分页查询用户
    @Override
    public 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,方便前端使用

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


网站公告

今日签到

点亮在社区的每一天
去签到