首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java使用 MyBatis-Plus 实现前端组装查询语句、后端动态执行查询的功能,

Java使用 MyBatis-Plus 实现前端组装查询语句、后端动态执行查询的功能,

原创
作者头像
JQ实验室
发布2025-08-05 11:28:33
发布2025-08-05 11:28:33
3180
举报
文章被收录于专栏:都到8月了都到8月了

以下是基于 MyBatis-Plus 的完整实现方案。


1. 前端设计

前端逻辑与之前的设计保持一致,依然是将用户输入的查询条件组装成 JSON 格式,并通过 HTTP 请求发送到后端。

示例请求体:

代码语言:json
复制
{
  "filters": [
    {
      "field": "name",
      "operator": "LIKE",
      "value": "John"
    },
    {
      "field": "age",
      "operator": ">=",
      "value": 25
    }
  ],
  "sort": [
    {
      "field": "age",
      "order": "DESC"
    }
  ],
  "page": {
    "size": 10,
    "number": 1
  }
}

2. 后端设计

2.1 定义请求对象

定义一个 Java 对象来接收前端传递的查询参数。

代码语言: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
    }
}

2.2 控制器层

定义一个 RESTful API 接口,接收前端传递的 JSON 数据,并调用服务层处理查询逻辑。

代码语言:java
复制
@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));
    }
}

2.3 服务层

在服务层中,使用 MyBatis-Plus 的 QueryWrapper 动态构建查询条件,并结合分页功能执行查询。

代码语言:java
复制
@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);
    }
}

2.4 Mapper 层

MyBatis-Plus 的 Mapper 层继承自 BaseMapper,无需额外定义方法。

代码语言:java
复制
@Mapper
public interface UserMapper extends BaseMapper<Map<String, Object>> {
}

3. 配置文件

确保在 application.properties 中配置了 MyBatis-Plus 和数据库连接信息:

代码语言:properties
复制
# 数据库连接配置
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

还需要配置分页插件:

代码语言:java
复制
@Configuration
public class MyBatisPlusConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}

4. 安全性考虑

  1. SQL 注入防护
    • 使用 MyBatis-Plus 的 QueryWrapper 动态构建查询条件,避免直接拼接 SQL 字符串。
    • 对于字段名和操作符,确保它们是可信的(例如,限制为预定义的白名单)。
  2. 权限控制
    • 在后端对查询条件进行校验,确保只有授权用户可以访问某些数据。
    • 可以根据用户角色动态调整查询逻辑。
  3. 日志记录
    • 记录用户的查询行为,便于审计和问题排查。

5. 测试与验证

  1. 单元测试
    • 编写单元测试验证动态条件构造器是否正确生成查询条件。
    • 使用 Mock 数据库测试查询结果。
  2. 集成测试
    • 启动 Spring Boot 应用,通过 Postman 或其他工具发送请求,验证接口功能。

总结

通过 MyBatis-Plus 的动态条件构造器(QueryWrapper),可以轻松实现前端组装查询语句、后端动态执行查询的功能。核心在于:

  1. 利用 QueryWrapper 动态构建查询条件,支持多种操作符。
  2. 结合 MyBatis-Plus 的分页插件,实现分页查询。
  3. 通过安全性设计,提升系统的灵活性与可靠性。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 前端设计
  • 2. 后端设计
    • 2.1 定义请求对象
    • 2.2 控制器层
    • 2.3 服务层
    • 2.4 Mapper 层
  • 3. 配置文件
  • 4. 安全性考虑
  • 5. 测试与验证
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档