以下是基于 MyBatis-Plus 的完整实现方案。
前端逻辑与之前的设计保持一致,依然是将用户输入的查询条件组装成 JSON 格式,并通过 HTTP 请求发送到后端。
示例请求体:
{
"filters": [
{
"field": "name",
"operator": "LIKE",
"value": "John"
},
{
"field": "age",
"operator": ">=",
"value": 25
}
],
"sort": [
{
"field": "age",
"order": "DESC"
}
],
"page": {
"size": 10,
"number": 1
}
}
定义一个 Java 对象来接收前端传递的查询参数。
public class QueryRequest {
private List<Filter> filters;
private List<Sort> sort;
private Page page;
// Getters and Setters
public static class Filter {
private String field;
private String operator;
private Object value;
// Getters and Setters
}
public static class Sort {
private String field;
private String order;
// Getters and Setters
}
public static class Page {
private int size;
private int number;
// Getters and Setters
}
}
定义一个 RESTful API 接口,接收前端传递的 JSON 数据,并调用服务层处理查询逻辑。
@RestController
@RequestMapping("/api/query")
public class QueryController {
@Autowired
private QueryService queryService;
@PostMapping
public ResponseEntity<Page<Map<String, Object>>> query(@RequestBody QueryRequest request) {
return ResponseEntity.ok(queryService.executeQuery(request));
}
}
在服务层中,使用 MyBatis-Plus 的 QueryWrapper
动态构建查询条件,并结合分页功能执行查询。
@Service
public class QueryService {
@Autowired
private UserMapper userMapper;
public Page<Map<String, Object>> executeQuery(QueryRequest request) {
// 创建分页对象
com.baomidou.mybatisplus.extension.plugins.pagination.Page<Map<String, Object>> page = new com.baomidou.mybatisplus.extension.plugins.pagination.Page<>(
request.getPage().getNumber(),
request.getPage().getSize()
);
// 创建查询条件构造器
QueryWrapper<Map<String, Object>> queryWrapper = new QueryWrapper<>();
// 解析过滤条件
for (QueryRequest.Filter filter : request.getFilters()) {
switch (filter.getOperator()) {
case "=":
queryWrapper.eq(filter.getField(), filter.getValue());
break;
case "!=":
queryWrapper.ne(filter.getField(), filter.getValue());
break;
case ">":
queryWrapper.gt(filter.getField(), filter.getValue());
break;
case "<":
queryWrapper.lt(filter.getField(), filter.getValue());
break;
case ">=":
queryWrapper.ge(filter.getField(), filter.getValue());
break;
case "<=":
queryWrapper.le(filter.getField(), filter.getValue());
break;
case "LIKE":
queryWrapper.like(filter.getField(), filter.getValue());
break;
default:
throw new IllegalArgumentException("Unsupported operator: " + filter.getOperator());
}
}
// 解析排序条件
if (request.getSort() != null && !request.getSort().isEmpty()) {
for (QueryRequest.Sort sort : request.getSort()) {
queryWrapper.orderBy(true, "ASC".equalsIgnoreCase(sort.getOrder()), sort.getField());
}
}
// 执行分页查询
return userMapper.selectMapsPage(page, queryWrapper);
}
}
MyBatis-Plus 的 Mapper 层继承自 BaseMapper
,无需额外定义方法。
@Mapper
public interface UserMapper extends BaseMapper<Map<String, Object>> {
}
确保在 application.properties
中配置了 MyBatis-Plus 和数据库连接信息:
# 数据库连接配置
spring.datasource.url=jdbc:mysql://localhost:3306/your_database
spring.datasource.username=root
spring.datasource.password=your_password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# MyBatis-Plus 配置
mybatis-plus.mapper-locations=classpath:mapper/*.xml
mybatis-plus.configuration.map-underscore-to-camel-case=true
# 分页插件配置
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
还需要配置分页插件:
@Configuration
public class MyBatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
QueryWrapper
动态构建查询条件,避免直接拼接 SQL 字符串。通过 MyBatis-Plus 的动态条件构造器(QueryWrapper
),可以轻松实现前端组装查询语句、后端动态执行查询的功能。核心在于:
QueryWrapper
动态构建查询条件,支持多种操作符。原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。