分页查询实现代码及说明

标题1. Controller 层代码

// 获取请求中的查询参数(以"search_"为前缀)
Map<String, Object> searchParams = Servlets.getParametersStartingWith(request, "search_");

// 调用服务层进行分页查询
IPage<User> page = userService.getPageList(pageNumber, pageSize, searchParams);

2. Service 层代码

@Override
public IPage<User> getPageList(int pageNumber, int pageSize, Map<String, Object> searchParams) {
    // 创建分页对象(使用不可变分页构造,参数:页码、每页条数)
    Page<User> page = Page.of(pageNumber, pageSize);
    
    // 构建动态查询条件
    LambdaQueryWrapper<User> queryWrapper = buildLambdaQueryWrapper(searchParams);
    
    // 设置排序规则(是否启用排序:true,排序方式:升序(true),排序字段:username)
    queryWrapper.orderBy(true, true, User::getUsername);
    
    // 执行分页查询
    Page<User> userPage = userMapper.selectPage(page, queryWrapper);
    
    return userPage;
}

/**
 * 构建动态查询条件
 * @param searchParams 包含查询参数的Map(key为字段名,value为查询值)
 * @return LambdaQueryWrapper<User> 动态查询条件对象
 */
private LambdaQueryWrapper<User> buildLambdaQueryWrapper(Map<String, Object> searchParams) {
    LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
    
    if (searchParams != null && !searchParams.isEmpty()) {
        // 用户名模糊查询(若参数存在且不为空)
        Object username = searchParams.get("username");
        if (username instanceof String && StringUtils.isNotBlank((String) username)) {
            queryWrapper.like(User::getUsername, username);
        }
        
        // 姓名模糊查询(若参数存在且不为空)
        Object name = searchParams.get("name");
        if (name instanceof String && StringUtils.isNotBlank((String) name)) {
            queryWrapper.like(User::getName, name);
        }
    }
    
    return queryWrapper;
}

3. IPage 分页对象说明

IPage 是 MyBatis-Plus 提供的分页接口,用于封装分页查询结果,包含分页信息和数据列表。

标题核心属性

属性名 类型 说明
records List 当前页的数据列表
total long 总记录数
size long 每页显示条数
current long 当前页码
pages long 总页数(自动计算)
optimizeCountSql boolean 是否优化 COUNT SQL(默认 true)
searchCount boolean 是否查询总记录数(默认 true)

标题常用方法

方法名 返回值 说明
getRecords() List 获取当前页数据列表
getTotal() long 获取总记录数
getSize() long 获取每页显示条数
getCurrent() long 获取当前页码
getPages() long 获取总页数
setSearchCount(boolean) void 设置是否查询总记录数

标题4. 分页对象创建说明

不可变分页(推荐):Page.of(pageNumber, pageSize)
适用于分页参数创建后无需修改的场景,避免意外修改页码 / 条数,提高安全性。
可变分页:new Page<>(pageNumber, pageSize)
适用于需要动态调整分页参数(如中途修改每页条数)的场景,灵活性更高。
5. 排序方法说明
queryWrapper.orderBy(boolean condition, boolean isAsc, SFunction<T, ?> column)

condition:是否启用排序(true = 启用)
isAsc:排序方式(true = 升序,false = 降序)
column:排序字段(使用方法引用,如 User::getUsername)

通过以上实现,可实现动态条件分页查询,支持灵活的参数过滤和排序,且分页信息通过 IPage 统一封装,便于前端展示分页控件(如页码导航、总条数显示等)。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐