前言
关于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);
}