当前位置: 首页 > news >正文

构建可无限扩展的系统:基于 FreeMarker + 存储过程 + Spring Boot 的元数据驱动架构设计

在构建面向多行业、多客户的大型业务系统时,系统的灵活性与扩展能力成为架构设计的核心目标。传统硬编码的开发方式在面对高频变化、复杂组合查询、多租户自定义字段时,往往难以适应。

为了解决上述问题,我们提出一种 以 FreeMarker 脚本托管于数据库为核心、动态 SQL 生成与存储过程配合、Spring Boot 提供运行支撑 的平台化架构,构建一个可以无限扩展、无需重新编译即可上线新业务的低代码基础系统


一、架构设计理念

系统基于如下三大支柱设计:

  1. FreeMarker + 数据库模板:将 SQL 脚本模板存入数据库,运行时动态渲染;

  2. Spring Boot 服务层驱动执行:所有模板通过统一 API 网关执行,参数绑定、权限校验、结果封装统一管理;

  3. 存储过程支持重逻辑计算:数据变更逻辑封装至存储过程,保障一致性与高性能。

整体架构图如下:

+------------+      +---------------------+      +----------------------+
|   客户端    | ---> | 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}
}

服务端处理流程:

  1. 读取模板表(fm_sql_template)中 content

  2. 通过 FreeMarker 渲染 SQL;

  3. 根据模板类型执行查询;

  4. 返回统一结构,如:

{"code": 0,"data": [{ "id": 1, "name": "张三", "status": 1 },...]
}

四、复杂业务使用存储过程封装

  • FreeMarker 模板也可以用于构造调用存储过程的 SQL:

CALL update_order_status(${orderId}, ${status})
  • 或者模板只做参数拼接,调用统一封装的服务过程。

此设计可以在 FreeMarker 中动态构造多个参数调用,解决复杂流程驱动的问题。


五、系统扩展能力分析

能力设计策略
多表查询在模板中嵌入 JOIN 与条件控制逻辑
多租户支持通过租户上下文自动注入条件如 tenant_id
字段级权限动态控制字段渲染(FreeMarker <#if>
接口权限每个模板关联权限角色或角色字段
模板管理后台管理系统维护模板、测试SQL、预览结果
模板调试提供前端调试界面 + mock参数调试
热更新模板从数据库读取,更新后立即生效

六、安全性策略

  1. 参数预处理:防止 SQL 注入,变量使用 ${} + PreparedStatement 安全绑定;

  2. 模板白名单控制:不允许任意模板执行,仅允许授权模板;

  3. 日志审计:记录每次执行的模板、参数、最终SQL、执行耗时、调用者;

  4. SQL执行限制:分析SQL是否为只读,防止危险写入操作通过模板方式绕过控制。


七、与传统系统的差异

项目传统系统基于DB Template的灵活系统
查询扩展能力每种组合写一个 DAO 方法一个模板支持无限组合
字段扩展修改代码 + 编译 + 发布修改模板或元数据即可生效
业务上线速度周级交付周期小时级上线
多租户支持写多套代码分支模板参数驱动即可区分
技术人员要求中高级开发为主初级也可维护

八、未来演进方向

  • 模板依赖分析:支持嵌套模板,如 公共where条件 + 主SQL块

  • 可视化构建器:提供 DSL 或可视化界面拼装模板;

  • 数据字段中心:结合业务表字段元信息自动提示字段、构造模板;

  • AI生成SQL模板:结合自然语言生成 FreeMarker 模板草稿;

  • 版本管理与回滚:模板版本控制,支持历史比对与回滚发布。


结语

将 FreeMarker SQL 模板托管在数据库中,是构建大规模、多变系统的一种强大手段。它不仅显著提升了系统的灵活性,还降低了交付成本,并为业务快速响应提供了强有力的支持。

该架构尤其适合以下场景:

  • 企业级低代码平台;

  • 多租户 SaaS 系统;

  • 数据中台查询服务;

  • 报表查询与权限可控数据接口。

以元数据为核心的架构,最终构建的是一套“以数据描述逻辑,以模板执行逻辑,以平台控制行为”的现代化后端基础设施。

http://www.lryc.cn/news/575677.html

相关文章:

  • aws(学习笔记第四十七课) codepipeline-docker-build
  • [3D-portfolio] 版块包装高阶组件(封装到HOC) | Email表单逻辑 | 链式调用
  • 微服务分布式事务解决方案
  • 数据结构进阶 第七章 图(Graph)
  • 当ERP不再“一刀切“:ERP定制开发如何重塑企业数字神经
  • Charles抓包工具深度解析:从原理到实践的网络数据透视艺术
  • 利用云效实现自动化部署gitee仓库中的项目
  • Tailwind CSS 重用样式
  • 如果你在为理解RDA、PCA 和 PCoA而烦恼,不妨来看看丨TomatoSCI分析日记
  • 临床试验项目管理:高效推进新疗法上市
  • EXILIUM×亚矩云手机:重构Web3虚拟生存法则,开启多端跨链元宇宙自由征途
  • 用 Spark 优化亿级用户画像计算:Delta Lake 增量更新策略详解
  • Mac电脑如何搭建基于java后端的开发的各种工具服务
  • Ubuntu 下降 Linux Kernel 的版本备忘
  • 使用CSS泄露标签属性值 url路径遍历攻击 -- GPN CTF 2025 PAINting Dice
  • 【STL】深入理解 vector 的底层实现思想和使用
  • 东芝e-STUDIO 2323AMW双面复印报计数器溢出故障
  • 【CMake基础入门教程】第七课:查找并使用第三方库(以 find_package() 为核心)
  • [论文阅读] 人工智能+ | 用大语言模型给建筑合规检查“开挂“:BIM领域的自动化革命
  • python的银行柜台管理系统
  • Python 常用正则表达式大全
  • 【51单片机5毫秒定时器】2022-6-1
  • python打卡day43
  • 常见的排序方法
  • Jenkins 部署与使用
  • 在Visual Studio使用Qt的插件机制进行开发
  • Nordic nRF54L15 SoC对包含电池监测、中断处理和电源轨控制的定制 nPM1300 示例
  • UE Universal Camera 相机插件-限制镜头在区域内移动
  • 【Docker基础】Docker容器管理:docker restart详解
  • 使用Charles中文版抓包工具进行高效的API调试与性能优化