Spring Boot MyBatis-Plus 构建查询对象进行分页查询
本文档描述了如何在 Spring Boot 项目中使用 MyBatis-Plus 实现带有多条件查询和排序的分页功能。
1. 查询对象 (QueryDTO)
创建一个查询对象来封装所有查询参数:
package com.example.order.dto;
import lombok.Data;
@Data
public class InquiryOrderQueryDTO {
// 排序字段
private String sortField;
// 排序方向 (true: 升序, false: 降序)
private Boolean ascending = true;
// 查询关键字
private String keyword;
// 状态
private String status;
// 开始时间
private String startTime;
// 结束时间
private String endTime;
}
2. 控制器实现
package com.example.order.controller;
@RestController
@RequestMapping("/inquiryOrder")
public class InquiryOrderController {
@Autowired
private InquiryOrderService inquiryOrderService;
@GetMapping("/code")
public ApiResponse<IPage<Map<String, Object>>> getCode(
@RequestParam(defaultValue = "1") int page,
@RequestParam(defaultValue = "5") int size,
InquiryOrderQueryDTO queryDTO) {
Page<Map<String, Object>> orderPage = new Page<>(page, size);
IPage<Map<String, Object>> inquiryOrders = inquiryOrderService.selectCode(orderPage, queryDTO);
return ApiResponse.success(inquiryOrders);
}
}
3. 服务层实现
package com.example.order.service.impl;
@Service
public class InquiryOrderServiceImpl extends ServiceImpl<InquiryOrderMapper, InquiryOrder>
implements InquiryOrderService {
@Override
public IPage<Map<String, Object>> selectCode(Page<Map<String, Object>> page, InquiryOrderQueryDTO queryDTO) {
QueryWrapper<InquiryOrder> queryWrapper = new QueryWrapper<>();
// 添加查询条件
if (StringUtils.hasText(queryDTO.getKeyword())) {
queryWrapper.like("code", queryDTO.getKeyword())
.or()
.like("name", queryDTO.getKeyword());
}
// 添加状态查询
if (StringUtils.hasText(queryDTO.getStatus())) {
queryWrapper.eq("status", queryDTO.getStatus());
}
// 添加时间范围查询
if (StringUtils.hasText(queryDTO.getStartTime())) {
queryWrapper.ge("create_time", queryDTO.getStartTime());
}
if (StringUtils.hasText(queryDTO.getEndTime())) {
queryWrapper.le("create_time", queryDTO.getEndTime());
}
// 添加排序
if (StringUtils.hasText(queryDTO.getSortField())) {
if (Boolean.TRUE.equals(queryDTO.getAscending())) {
queryWrapper.orderByAsc(queryDTO.getSortField());
} else {
queryWrapper.orderByDesc(queryDTO.getSortField());
}
} else {
// 默认按创建时间降序
queryWrapper.orderByDesc("create_time");
}
return baseMapper.selectMapsPage(page, queryWrapper);
}
}
4. 使用说明
API 请求示例
GET /inquiryOrder/code?page=1&size=10&sortField=create_time&ascending=false&keyword=TEST&status=PENDING
查询参数说明
-
分页参数
page
: 当前页码(默认值:1)size
: 每页数量(默认值:5)
-
排序参数
sortField
: 排序字段名ascending
: 排序方向(true: 升序,false: 降序)
-
过滤条件
keyword
: 关键字搜索(支持模糊匹配)status
: 状态过滤startTime
: 开始时间endTime
: 结束时间
功能特点
-
灵活的排序
- 支持任意字段排序
- 可选择升序或降序
- 默认按创建时间降序
-
多条件查询
- 支持关键字模糊搜索
- 支持状态筛选
- 支持时间范围筛选
-
分页功能
- 支持自定义页码和每页数量
- 返回总记录数和分页信息
返回结果示例
{
"code": 200,
"message": "success",
"data": {
"records": [...],
"total": 100,
"size": 10,
"current": 1,
"pages": 10
}
}
5. 注意事项
- 确保已配置 MyBatis-Plus 分页插件
- 注意字段名与数据库字段的对应关系
- 建议对敏感字段进行安全处理
- 考虑添加参数验证