构建可无限扩展的系统:基于 FreeMarker + 存储过程 + Spring Boot 的元数据驱动架构设计
在构建面向多行业、多客户的大型业务系统时,系统的灵活性与扩展能力成为架构设计的核心目标。传统硬编码的开发方式在面对高频变化、复杂组合查询、多租户自定义字段时,往往难以适应。
为了解决上述问题,我们提出一种 以 FreeMarker 脚本托管于数据库为核心、动态 SQL 生成与存储过程配合、Spring Boot 提供运行支撑 的平台化架构,构建一个可以无限扩展、无需重新编译即可上线新业务的低代码基础系统。
一、架构设计理念
系统基于如下三大支柱设计:
-
FreeMarker + 数据库模板:将 SQL 脚本模板存入数据库,运行时动态渲染;
-
Spring Boot 服务层驱动执行:所有模板通过统一 API 网关执行,参数绑定、权限校验、结果封装统一管理;
-
存储过程支持重逻辑计算:数据变更逻辑封装至存储过程,保障一致性与高性能。
整体架构图如下:
+------------+ +---------------------+ +----------------------+
| 客户端 | ---> | Spring Boot 控制器 | --> | Template Executor |
+------------+ +---------------------+ +----------------------+| - 读取DB中FreeMarker模板 || - 渲染SQL字符串 || - 执行JDBC / 存储过程 |+----------------------+|+------------------+| 数据库系统 || - SQL执行 || - 存储过程 |+------------------+
二、将 SQL 模板托管到数据库
表结构设计建议:
CREATE TABLE fm_sql_template (id BIGINT PRIMARY KEY AUTO_INCREMENT,code VARCHAR(100) NOT NULL, -- 模板唯一标识name VARCHAR(200) NOT NULL, -- 模板名称content TEXT NOT NULL, -- FreeMarker SQL内容result_type VARCHAR(50), -- 返回结果类型(list、single、page、count等)created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
示例数据内容(存于 content 字段):
SELECT * FROM user
WHERE 1=1
<#if name??>AND name LIKE CONCAT('%', '${name}', '%')
</#if>
<#if status??>AND status = ${status}
</#if>
ORDER BY created_at DESC
查询执行流程:
-
根据接口路径或编码查询模板;
-
使用参数 Map 渲染 FreeMarker;
-
最终拼出 SQL;
-
执行 JDBC 或调用存储过程;
-
将结果以标准格式返回。
三、统一入口的 API 执行模型
所有查询请求可通过如下统一接口完成:
POST /api/template/execute
{"templateCode": "user.list","params": {"name": "张三","status": 1}
}
服务端处理流程:
-
读取模板表(
fm_sql_template
)中content
; -
通过 FreeMarker 渲染 SQL;
-
根据模板类型执行查询;
-
返回统一结构,如:
{"code": 0,"data": [{ "id": 1, "name": "张三", "status": 1 },...]
}
四、复杂业务使用存储过程封装
-
FreeMarker 模板也可以用于构造调用存储过程的 SQL:
CALL update_order_status(${orderId}, ${status})
-
或者模板只做参数拼接,调用统一封装的服务过程。
此设计可以在 FreeMarker 中动态构造多个参数调用,解决复杂流程驱动的问题。
五、系统扩展能力分析
能力 | 设计策略 |
---|---|
多表查询 | 在模板中嵌入 JOIN 与条件控制逻辑 |
多租户支持 | 通过租户上下文自动注入条件如 tenant_id |
字段级权限 | 动态控制字段渲染(FreeMarker <#if> ) |
接口权限 | 每个模板关联权限角色或角色字段 |
模板管理 | 后台管理系统维护模板、测试SQL、预览结果 |
模板调试 | 提供前端调试界面 + mock参数调试 |
热更新 | 模板从数据库读取,更新后立即生效 |
六、安全性策略
-
参数预处理:防止 SQL 注入,变量使用
${}
+ PreparedStatement 安全绑定; -
模板白名单控制:不允许任意模板执行,仅允许授权模板;
-
日志审计:记录每次执行的模板、参数、最终SQL、执行耗时、调用者;
-
SQL执行限制:分析SQL是否为只读,防止危险写入操作通过模板方式绕过控制。
七、与传统系统的差异
项目 | 传统系统 | 基于DB Template的灵活系统 |
---|---|---|
查询扩展能力 | 每种组合写一个 DAO 方法 | 一个模板支持无限组合 |
字段扩展 | 修改代码 + 编译 + 发布 | 修改模板或元数据即可生效 |
业务上线速度 | 周级交付周期 | 小时级上线 |
多租户支持 | 写多套代码分支 | 模板参数驱动即可区分 |
技术人员要求 | 中高级开发为主 | 初级也可维护 |
八、未来演进方向
-
✅ 模板依赖分析:支持嵌套模板,如
公共where条件 + 主SQL块
; -
✅ 可视化构建器:提供 DSL 或可视化界面拼装模板;
-
✅ 数据字段中心:结合业务表字段元信息自动提示字段、构造模板;
-
✅ AI生成SQL模板:结合自然语言生成 FreeMarker 模板草稿;
-
✅ 版本管理与回滚:模板版本控制,支持历史比对与回滚发布。
结语
将 FreeMarker SQL 模板托管在数据库中,是构建大规模、多变系统的一种强大手段。它不仅显著提升了系统的灵活性,还降低了交付成本,并为业务快速响应提供了强有力的支持。
该架构尤其适合以下场景:
-
企业级低代码平台;
-
多租户 SaaS 系统;
-
数据中台查询服务;
-
报表查询与权限可控数据接口。
以元数据为核心的架构,最终构建的是一套“以数据描述逻辑,以模板执行逻辑,以平台控制行为”的现代化后端基础设施。