应用案例 · 源码级分析

AI加持的低代码工作流

AnyLine × h5ve 动态数据层深度解析

AnyLine 如何支撑低代码平台"动态建表 + 动态 CRUD + 动态数据源" 核心能力
与 MyBatis 形成完美的动静互补架构

动态建表 AnyLine Core DataSourceHolder 元数据引擎 MyBatis互补
动静分离
核心架构设计
运行时
数据操作模式
全生命周期
数据层覆盖
零侵入
业务代码无感知
1

架构全景:AnyLine × MyBatis 互补架构

动静分离:双引擎协同的数据层架构

应用层
可视化表单设计器
AI 辅助配置
动态页面配置
数据层(双引擎)
MyBatis 静态元数据
• PageInfo(页面配置)
• Datasource(数据源)
• Menu(菜单权限)
编译时已知的结构化数据
AnyLine 动态业务数据
• form_xxx(用户创建表单)
• 动态表 CRUD
• DDL 建表
运行时动态生成的表结构
数据库层
系统表 PageInfo / Menu / Datasource
业务表 form_xxx
运行时动态创建
维度 MyBatis AnyLine
操作对象 平台系统表(结构固定) 用户动态创建的表单表(结构未知)
实体映射 编译时已有 Java Entity 类 无实体类,运行时 DataRow 动态承载
DDL 支持 ❌ 不支持 ✅ 支持(create / drop / alter)
查询条件构建 XML 静态映射 ConfigStore 运行时动态组装
典型接口 pageInfoService.xxx() ServiceProxy.service().maps() / .insert()
设计时 已知结构 → 编译时绑定 未知结构 → 运行时决定
2

核心能力一:动态数据存取引擎

为运行时创建的表提供无需实体类的 CRUD 操作

动态查询 PageInfoController /genList
// 根据前端动态条件,查询 form_xxx 表
ConfigStore
configs = BuilderUtil.createConfigs(params, pageData);
// 动态组装查询条件:等于、模糊、范围等
List<Map>
result = ServiceProxy.service().maps(tableName, configs);
// tableName = "form_xxx",运行时才知道
动态增删改 PageInfoController /genSave
// 前端表单 JSON → AnyLine DataRow
DataRow
row = JSON.parseObject(data, DataRow.class);
// 动态 INSERT 或 UPDATE,字段由页面配置决定
AnylineService
service = ServiceProxy.service();
// service.insert(tableName, row) 或 service.update(tableName, row)
// 无需实体类,无需 Mapper 定义
// 批量删除
service.deletes(tableName, "id", ids);
查询条件构建 BuilderUtil.createConfigs
// 解析前端查询参数 + 页面配置 → ConfigStore
ConfigStore
createConfigs(params, pageData) {
// eq(等于) / like(模糊) / gt(大于) 等动态条件
// 附加数据权限过滤 DataAuthUtil.getSQLFilter()
// 字段名、比较方式全部由页面配置决定
}
// 返回的 ConfigStore 作为 genList 的唯一输入
3

核心能力二:动态元数据引擎(DDL)

低代码平台"动态建表"能力的基石

CREATE / DROP / ALTER · 运行时元数据操作

无需重启应用,用户在表单设计器点一下"保存",表结构自动生成

表单设计器 字段配置 + 保存 pageData JSON BuilderUtil createTable() Table 对象 addColumn() ddl() create() MySQL / PG / DM / 金仓 CREATE TABLE form_xxx ... ✓ 执行成功
🔍

表存在性检查

// 建表前检查表是否已存在
Table
table = service.metadata()
.table(tableName, false);
// tableName = "form_xxx"
🗑️

重建前删除旧表

// 删除已存在的表后重建
service.ddl()
.drop(table);
// 为后续 create(table) 让路
🧱

动态构建表结构

Table
table = new Table(tableName);
// 从页面配置解析业务字段
table.addColumn(column);
// 平台公共字段
table.addColumn(create_by);
table.addColumn(create_time);

执行建表 SQL

// 触发建表
service.ddl()
.create(table);
// AnyLine 自动生成并执行
// CREATE TABLE SQL 语句
4

核心能力三:动态数据源管理

运行时热注册(无需重启)

// 新增数据源
DataSourceHolder
.reg(alias, dataSource);
// 删除数据源
DataSourceHolder
.destroy(alias);

DatasourceController 的新增、修改、删除接口中,调用 DataSourceHolder API 实现数据源的动态注册与销毁。

Spring 启动自动初始化

// RefreshedEventListener
List<Datasource>
list = ServiceProxy.service()
.selects(Datasource.class, ...);
// 遍历注册所有启用数据源
for
(Datasource ds : list) {
DataSourceHolder.reg(ds.getAlias(), ds);
}

应用启动时,RefreshedEventListener 自动查询所有启用的数据源配置,循环注册到运行时环境,实现数据源配置的热加载

5

核心能力四:数据操作监听与扩展

TriggerDmListener:解耦的核心扩展点

// 实现 DMListener 接口
public class
TriggerDmListener implements DMListener {
// 数据插入后触发
void
afterInsert(DataRow row) {
// 自定义业务逻辑:日志、同步、消息通知
}
// 数据更新后触发
void
afterUpdate(DataRow row) {
// 与核心业务逻辑解耦
}
}
📋
操作日志记录
记录谁在什么时间改了哪些数据
🔔
消息通知触发
数据变更后自动发送通知
🔄
跨系统数据同步
变更后自动同步到下游系统
6

案例总结

AnyLine 在 h5ve-boot 中的定位

支撑"低代码"和"动态模型"两大核心特性的基石技术

🗄️
动态数据存取引擎
无需实体类的 CRUD
🧬
动态元数据引擎
CREATE/DROP/ALTER
🔌
动态数据源管理
热注册与热切换
🔗
数据操作扩展点
监听器解耦机制

💡 AnyLine 作用

验证"动态优先"设计思想:h5ve-boot 是 AnyLine 在低代码平台场景的典型标杆。表单字段完全未知,只有在用户保存配置后才生成表结构——这正是 AnyLine"面向未知领域"设计哲学的最佳注脚。

动静互补架构的教科书案例:MyBatis 负责静态系统元数据,AnyLine 负责动态业务数据,两者各司其职、相互补位,构成了完整的数据层解决方案。

🎯 可复制的技术路径

低代码平台的数据库层标准范式:AnyLine 的四层能力(CRUD / DDL / 热数据源 / 监听器)构成了低代码平台数据库层的完整技术路径,其他低代码项目可直接参考。

AI 时代的天然搭档:AI 生成表单 → AnyLine 动态建表 → 动态 CRUD,三者天然衔接,AI 辅助配置让低代码平台从"配置驱动"升级为"意图驱动"。

源码分析来源
• BuilderUtil.java — 动态查询条件构建 & 动态建表实现
• PageInfoController.java — 动态 CRUD 接口(/genList / genByCode / genSave / genDel)
• DatasourceController.java — 动态数据源热注册接口
• RefreshedEventListener.java — Spring 启动时数据源自动初始化
• TriggerDmListener.java — 数据操作监听器(afterInsert / afterUpdate)

分享案例获取系统性的技术支持

每一次数据库成功切换的背后,都有一段充满技术挑战与架构演进的故事