【技术碎片】分页查询 返回体PageResponse

982 阅读2分钟

在这里插入图片描述

前言

关于Mybatis-Plus分页查询和通用分页查询返回体实现的记录,仅能用,不完善

通用返回体PageResponse

PageResponse

分页请求体定义有:

PageResponse.java

import lombok.Data;

import java.io.Serializable;
import java.util.List;

@Data
public class PageResponse implements Serializable {

    /**
     * 总记录数
     */
    private int totalCount;

    /**
     * 每页记录数
     */
    private int pageSize;

    /**
     * 总页数
     */
    private int totalPage;

    /**
     * 当前页数
     */
    private int pageNo;

    /**
     * 列表数据
     */
    private List<?> list;
    
    /**
     * 分页
     *
     * @param list       列表数据
     * @param totalCountReq 总记录数
     * @param pageSizeReq   每页记录数
     * @param pageNoReq   当前页数
     */
    public PageResponse(List<?> list, int totalCountReq, int pageSizeReq, int pageNoReq) {
        // 参数设置
        int total = totalCountReq;
        int pageSize = pageSizeReq;
        int pageNo = pageNoReq;
        int startRow = pageNo > 0 ? (pageNo - 1) * pageSize : 0;
        int endRow = startRow + pageSize * (pageNo > 0 ? 1 : 0);
        startRow = Math.min(total, startRow);
        endRow = Math.min(total, endRow);
        int totalPage = (total % pageSize == 0) ? (total/pageSize) : (total/pageSize + 1);
        // 分页
        list = list.subList(startRow, endRow);

        this.totalCount = total;
        this.pageSize = pageSize;
        this.totalPage = totalPage;
        this.pageNo = pageNo;
        this.list = list;

    }
}


int pageSizeReq, int pageNoReq 一般是请求体传过来的,比如:

import lombok.Data;

@Data
public class PageRequest implements Serializable {

   /**
    * 当前页数
    */
   private int pageNo = 1;

   /**
    * 每页记录数
    */
   private int pageSize = 10;

}

Response

同一请求体有: Response.java


/**
 * 统一Response
 * @author 
 */
@Data
@EqualsAndHashCode
public class Response<T> implements Serializable {

    private static final long serialVersionUID = 2760683477101939502L;

    /**
     * 响应码
     * @see org.sample.common.Constants#RESULT_CODE_SUCCESS
     */
    @NotNull
    private int responseCode;

    /**
     * 消息内容
     */
    @NotNull
    private String message;  // 注释也可以写在这里

    /**
     * 响应数据
     */
    private T data;

}

ResponseGenerator

响应结果生成工具有:

ResponseGenerator.java

package org.sample.common.response;

import org.sample.common.Constants;
import org.springframework.util.StringUtils;

/**
 * 响应结果生成工具
 * @author
 */
public class ResponseGenerator {


    public static Response genSuccessResponse() {
        Response response = new Response();
        response.setResponseCode(Constants.RESULT_CODE_SUCCESS);
        response.setMessage(Constants.DEFAULT_SUCCESS_MESSAGE);
        return response;
    }

    public static Response genSuccessResponse(String message) {
        Response response = new Response();
        response.setResponseCode(Constants.RESULT_CODE_SUCCESS);
        response.setMessage(message);
        return response;
    }

    public static Response genSuccessResponse(Object data) {
        Response response = new Response();
        response.setResponseCode(Constants.RESULT_CODE_SUCCESS);
        response.setMessage(Constants.DEFAULT_SUCCESS_MESSAGE);
        response.setData(data);
        return response;
    }

    public static Response genFailResponse(String message) {
        Response response = new Response();
        response.setResponseCode(Constants.RESULT_CODE_SERVER_ERROR);
        if (StringUtils.isEmpty(message)) {
            response.setMessage(Constants.DEFAULT_FAIL_MESSAGE);
        } else {
            response.setMessage(message);
        }
        return response;
    }

    public static Response genErrorResponse(int code, String message) {
        Response response = new Response();
        response.setResponseCode(code);
        response.setMessage(message);
        return response;
    }
}

HelloController

实例接口如下:

HelloController.java

/**
 * 测试接口
 * @author aaa
 */
@RestController
public class HelloController {

    /**
     * @param id 用户id
     * @param pageRequest 分页请求
     * @return Response<PageRequest> 返回体
     * @throws IOException
     */
    @RequestMapping("/say-hello")
    public Response<PageRequest> sayHello(@RequestParam("id") @NotNull String id,
                                          @RequestBody PageRequest pageRequest) throws IOException {
                                          
        Response<PageRequest> response = ResponseGenerator.genSuccessResponse(pageRequest);
        return response;
    }

}

Mybatis-Plus分页查询

MybatisPlusConfig

使用分页查询时需要配置mybatis-plus分页拦截器,不配置会导致分页查询时,返回的分页体中total为空,因为mybatis-plus为了性能考虑分页查询时默认不执行select count(*)。

MybatisPlusConfig.java

/**
 * mybatis-plus 配置类
 * @author zengweiyu
 * @since 2022-11-7
 */
@Configuration
public class MybatisPlusConfig {

    /**
     * mybatis-plus分页拦截器
     * 不配置会导致分页查询无法范湖total总数
     * @return MybatisPlusInterceptor
     */
    @Bean
    public MybatisPlusInterceptor paginationInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 添加分页插件
        PaginationInnerInterceptor pageInterceptor = new PaginationInnerInterceptor();
        // 设置数据库类型
        pageInterceptor.setDbType(DbType.POSTGRE_SQL);
        interceptor.addInnerInterceptor(pageInterceptor);
        return interceptor;
    }
}

userEntityServiceImpl

分页查询使用mybatis-plus 的 selectPage方法,除了传入Wrappers.lambdaQuery之外还需要传入mybatis-plus内置的分页体Page,并自定义pageNo和pageSize。

我们有服务实现类

userEntityServiceImpl.java

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

		......

		// 初始化分页数
        Integer pageNo = userQueryRequest.getPageNo();
        Integer pageSize = userQueryRequest.getPageSize();
        // 初始化SQL分页查询结果
        Page<UserEntity> userEntityPage = null;
        
        try {
            userEntityPage = userEntityMapper.selectPage(
                new Page<>(pageNo, pageSize),
                Wrappers.lambdaQuery(UserEntity.class)
                    .like(UserEntity::getAccountName, accountName)
                    .like(UserEntity::getContentTitle, contentTitle)
                    .eq(UserEntity::getStatus, userQueryRequest.getStatus())
            ));
            logger.info("message tasks query");
        } catch (Exception e) {
        	logger.error("unknown exception when using database", e);
			throw new RuntimeException(e);
        }