1. 项目背景与核心价值
在传统报表系统开发中,最让人头疼的就是处理五花八门的查询条件组合。每次业务方提出"能不能加个按部门筛选"、"能否同时按日期和金额范围查询"这类需求,开发人员就得修改SQL、调整接口参数。这个项目正是为了解决这个痛点而生——通过动态SQL和条件编排器的组合拳,让前端可以像搭积木一样自由组合查询条件。
我在金融行业做数据平台时,曾遇到过一个月内修改了17次同一张报表的查询逻辑。正是这种经历让我意识到,必须设计一套能灵活应对条件变化的解决方案。现在这套方案已经在生产环境稳定运行3年,支撑日均20万+的查询请求。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构设计
2.1 整体技术栈选型
选择SpringBoot作为基础框架是考虑到其快速启动和约定优于配置的特性。对于持久层,我们没有用JPA而是坚持MyBatis,原因很实际:
- 报表查询往往涉及复杂SQL和特定数据库函数(如Oracle的PIVOT)
- 需要精细控制执行计划,JPA生成的SQL难以优化
- 历史系统迁移成本低,大部分企业原有系统都使用MyBatis
动态SQL的实现采用了MyBatis原生的OGNL表达式,比拼接字符串更安全优雅。条件编排器则是自主设计的DSL(领域特定语言),通过JSON结构描述条件关系。
2.2 核心组件交互流程
code复制前端
│
└─提交 JSON条件描述
│
v
Controller层
│
└─验证&转换条件DSL
│
v
Service层
│
├─条件编排器解析
│ │
│ └─生成查询元数据
│ │
│ v
└─动态SQL构造器 ←─ MyBatis映射文件
│
v
数据库查询
这个流程的关键在于条件DSL的设计,我们采用了类似GraphQL的嵌套结构:
json复制{
"conditions": [
{
"field": "createTime",
"operator": "BETWEEN",
"value": ["2023-01-01", "2023-12-31"]
},
{
