1. 项目背景与痛点分析
在传统企业报表系统中,业务人员经常需要根据各种条件组合来查询数据。比如销售部门想查看"华北地区VIP客户最近30天消费金额超过1000元的订单",而市场部门可能需要"手机品类近7天售价在500-2000元之间的商品销售数据"。
这类需求看似简单,但技术实现上却存在诸多挑战:
- 代码爆炸:采用if-else硬编码方式,每新增一个查询条件组合就需要修改代码。一个包含10个条件的报表,理论上可能有上千种组合方式
- 维护困难:随着业务发展,查询条件频繁变更,导致代码需要不断修改和发布
- 性能瓶颈:动态拼接SQL时容易产生性能问题,特别是当条件组合复杂时
- 灵活性差:业务人员无法自主配置查询条件,完全依赖开发人员实现
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 整体架构设计
2.1 技术选型考量
经过对多种技术方案的评估,我们最终确定以下技术栈:
- Spring Boot 2.7:提供快速应用开发能力,简化配置
- MyBatis-Plus 3.5:强大的动态SQL构建能力,支持Lambda表达式
- Easy Rules 4.1:轻量级规则引擎,适合处理条件组合逻辑
- MySQL 8.0:关系型数据库,支持复杂查询
- Jackson:处理前端传递的JSON格式条件
选择这些技术的主要考虑因素:
- MyBatis-Plus的QueryWrapper能优雅构建动态SQL,避免手动拼接字符串
- Easy Rules规则引擎足够轻量,学习成本低,适合处理条件组合场景
- Spring Boot生态完善,能快速集成各组件
2.2 系统架构图
code复制[前端界面]
↓ (JSON条件配置)
[API网关]
↓
[条件解析服务] → [规则引擎]
↓
[动态SQL构建]
↓
[数据查询服务] → [MySQL]
3. 核心实现细节
3.1 查询条件模型设计
我们设计了通用的条件模型,用JSON表示如下:
json复制{
"conditions": [
{
"field": "order_amount",
"operator": "gt",
"value": 1000,
"connector": "AND"
},
{
"field": "region",
"operator": "eq",
"value": "north_china",
"connector": "AND"
}
]
}
关键字段说明:
field:数据库字段名operator:比较运算符(gt/lt/eq/like等)value:比较值connector:条件连接方式(AND/OR)
3.2 动态SQL构建器实现
基于MyBatis-Plus的QueryWrapper,我们封装了动态SQL构建器:
java复制public class DynamicQueryBuilder {
public static <T> QueryWrapper<T> buildQueryWrapper(
List<Condition> conditi
