构建可无限扩展的系统:基于 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.pswp.cn/news/912553.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/912553.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2-深度学习挖短线股-3-训练数据计算

2-3 合并输入特征 首先定义了数据预处理函数&#xff0c;将连续 n 天的 K 线数据&#xff08;如开盘价、收盘价、成交量等&#xff09;合并为一行特征&#xff0c;同时保留对应的目标标签&#xff08;buy 列&#xff0c;表示是否应该买入&#xff09;&#xff1b;然后读取股票代…

SpringMVC系列(四)(请求处理的十个实验(下))

0 引言 作者正在学习SpringMVC相关内容&#xff0c;学到了一些知识&#xff0c;希望分享给需要短时间想要了解SpringMVC的读者朋友们&#xff0c;想用通俗的语言讲述其中的知识&#xff0c;希望与诸位共勉&#xff0c;共同进步&#xff01; 本系列会持续更新&#xff01;&…

产线通信“变形记”:PROFIBUS-DP与ETHERNET/IP的食品饮料跨界融合

在食品饮料加工行业&#xff0c;为实现不同设备间高效通信&#xff0c;JH-PB-EIP疆鸿智能PROFIBUS DP转ETHERNET/IP网关发挥着关键作用。西门子PLC常采用PROFIBUS DP协议&#xff0c;而码垛机器人等设备多使用ETHERNET/IP协议&#xff0c;网关成为连接二者的桥梁。 将DP作为从站…

设计模式-观察者模式(发布订阅模式)

一、需要的类 一个发布类&#xff1a;里面一个是别人需要订阅的属性&#xff0c;以及用于存储订阅者的list&#xff0c;attach方法是往list集合里面添加元素&#xff0c;notifyObservers通知方法&#xff0c;也就是循环调用订阅者里面的一个方法&#xff0c;这个notifyObserve…

Linux测试是否能联网

ping百度看是否有返回包&#xff1a; ping www.baidu.com ping -c可以通过参数提前设置发送的包数量&#xff1a; ping -c 4 www.baidu.com 终止ping快捷键&#xff1a; 按下 Ctrl C&#xff1a;立即终止ping进程&#xff0c;并显示统计信息。按下 Ctrl Z&#xff1a;将进…

TOGAF® 架构分区:优秀架构的秘密

TOGAF &#xff08;The Open Group架构框架&#xff09;已成为企业架构事实上的全球标准, 是世界上使用最广泛的企业架构框架。 它为企业 IT 架构的设计、规划、实施和管理提供了一套全面的方法和工具。但是&#xff0c;即使是经验丰富的架构师也经常会忽略 TOGAF 中隐藏的宝…

如何让视频在特定的网站上播放/禁止播放?(常见的视频防盗链技术之一)

一、需求背景 在各行各业中,不论是教育、贸易还是医疗领域,视频内容都存在被盗用的风险。为加强视频安全性,我们可以采取特殊设置措施,例如限制视频仅在高安全性网站播放,或屏蔽高风险网站。那么,具体有哪些方法可以有效保护视频安全呢? 二、需求解决 通过OVP防盗链技…

如何调鼠标的灵敏度 快速调节超简单

鼠标灵敏度是指鼠标在移动时&#xff0c;指针在屏幕上移动的速度。适当的鼠标灵敏度不仅能够提高工作效率&#xff0c;还能减少手部疲劳&#xff0c;优化游戏体验。那么不同的使用场景&#xff0c;鼠标灵敏度怎么调呢&#xff1f;本文将详细探讨如何调整鼠标灵敏度&#xff0c;…

基于单次常规脑MRI的深度学习检测多发性硬化症急性和亚急性病变活动性|文献速递-最新论文分享

Title 题目 Deep learning detection of acute and sub-acute lesion activity from single-timepoint conventional brain MRI in multiple sclerosis 基于单次常规脑MRI的深度学习检测多发性硬化症急性和亚急性病变活动性 01 文献速递介绍 多发性硬化症&#xff08;MS&am…

CloudFormation 实现 GitHub Actions OIDC 与 AWS ECR 的安全集成

引言:现代 CI/CD 的安全挑战 在容器化应用部署流程中,传统长期凭证管理已成为主要安全痛点。本文将详细介绍如何通过 AWS CloudFormation 实现 GitHub Actions 与 Amazon ECR 的安全集成,利用 OIDC(OpenID Connect)技术消除长期凭证风险,构建符合企业级安全标准的 CI/CD…

JMeter常用断言方式

简介 接口断言是接口测试中用于验证响应结果是否符合预期的关键机制&#xff0c;根据业务需求编写脚本添加断言&#xff0c;可验证接口的正确性。以下内容仅记录常用的断言方式&#xff0c;多个接口都有断言时可以使用事务控制器来隔离不同的断言。 断言方式 1、响应断言 1.…

web服务器搭建nginx

1 配置主机ip 1.1获取主机ip ip a rootpc:/home/ruxin# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft foreve…

ubuntu ollama 遇到的若干问题

服务器原先有ollama&#xff0c;想要重装&#xff0c;遇到一系列问题 安装下载连接&#xff1a;https://github.com/ollama/ollama/blob/main/docs/linux.md模型下载链接&#xff1a;https://ollama.com/library/deepseek-r1:1.5b 一、安装新的ollama 在root用户下操作 1.卸…

Linux: errno: EMSGSIZE 5

最近看到一个envoy在发送UDP包时返回的错误:sendmsg failed with error code 5 这里的error code 5其实是,envoy自己定义的error code: case SOCKET_ERROR_MSG_SIZE:return IoErrorCode::MessageTooBig;class IoError {public:enum class

深度剖析 LNK 参数隐藏攻击 (ZDI-CAN-25373)

1、漏洞描述 ZDI-CAN-25373 是一个 Windows 快捷方式文件(.LNK)漏洞,它允许攻击者通过精心制作的恶意快捷方式文件来执行隐藏的恶意命令。攻击者通过在 .LNK 文件的 COMMAND_LINE_ARGUMENTS 结构中填充大量空白字符(如空格、水平制表符、换行符等)来隐藏恶意命令。这些填…

Linux操作系统笔记3

接口管理命令&#xff1a; ip命令 字符终端 nmcli命令 字符终端 nmtui命令 可视化终端 ip命令&#xff1a; 使用 ip 命令可以配置临时网络的连接信息&#xff0c;相关命令如下&#xff1a; ip link&#xff1a;显示网络设备运行状态 ip -s link&#xff1a;显示更详细的设备信…

Vue3 根据路由配置实现动态菜单

前言 最近在学习Vue3的相关语法&#xff0c;在阅读官方文档的时候觉得官方文档的菜单栏比较简洁美观&#xff0c;于是想着能不能自己实现一个类似的多级菜单。代码大部分由AI所做&#xff08;感谢活在这个人工智能时代&#xff09;。 设计 主要就是路由设计以及菜单设计 路…

C#中 Winform如何实现跨页面调用

设计页面 如下 其中Form2为启动项 当点击订阅消息的时候 会创建Form1页面 当 Form1页面的点击发送的时候 自动将发送的消息同步到label1中 Form2的代码如下 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using S…

一个完整的Python解决方案,用于使用机器学习筛选最优模型并分析纳米酶特征与Km/Vmax的相关性

以下是一个完整的Python解决方案,用于使用机器学习筛选最优模型并分析纳米酶特征与Km/Vmax的相关性。代码包含数据预处理、模型选择、特征相关性分析和结果可视化,并附带详细注释。 import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn…

用python可视化南方大暴雨及洪水数据分析

用python可视化南方大暴雨及洪水数据分析 截至20250621,南方地区(特别是广东、广西、湖南等地)遭遇的极端暴雨和洪水灾害&#xff0c;斑点鱼将使用Python进行数据分析和可视化&#xff0c;展示洪水影响区域、雨势强度以及经济损失等情况。 数据搜集如下&#xff1a; import …