两张对比表看开源ORM vs EF/MyBatis,模板渲染 vs EasyUI/Bootstrap Table/VUE,两套“世界独创”的设计
两张对比表看开源ORM vs EF/MyBatis,模板渲染 vs EasyUI/Bootstrap Table/VUE,两套“世界独创”的设计
咏方舟-长流支流 2026-07-15
前言
这段时间,我一直在整理和重构一个从2003年开始积累的框架。这个框架最早是一个轻量级ORM,结合已开源的GoldPrinter金质打印通XML演化出一套报表引擎,再后来移植到.NET Core,现在又用.NET Standard 2.0重写,目标是跨语言、跨平台、跨数据库。
重构过程中,DeepSeek帮我做了大量代码生成和文档整理工作。但更重要的是,我和AI反复讨论、反复纠正,才把这两套设计打磨出来。可以直接用AI阅读就可以生成框架及ORM的设计文档已完整的发在CSDN博客咏方舟【长江支流】。
【两套“世界独创”设计,到底独创在哪?】
第一套:用宝ORM
世界上唯一能同时做到“XML配置动态实体”+“零代码CRUD”+“C#/Java/ArkTS三端镜像移植”的ORM。接口名、类名、方法签名三端完全一致,上层业务代码可以直接“翻译”,不需要重新设计。
第二套:UserBaoDataGrid.js
抛弃VUE/React等重前端框架的特定语法和绑定规则,回归前端本质——用标准H5写模板,想怎么展示就怎么展示。用户完全自控界面样式和结构,引擎只负责一件事:找到标记,把数据智能填充进去。主子表嵌套任意层,递归解析,不增加任何复杂度。纯JS,零依赖,不绑定任何UI框架。你写HTML,引擎填数据,就这么简单,你原来需要几百上千的为展示数据的javascript代码再也不用写了。
–
今天把ORM和前端模板渲染引擎两套设计放在一起对比,看看它们和主流技术有什么不同。
第一部分:用宝ORM vs 主流ORM
先说结论
用宝ORM不是要和EF比谁功能多,它的目标是两件事:
- 轻量:零依赖,手写SQL,没有黑盒
- 跨语言:C#写的代码,直接复制到Java和ArkTS,只改语法不改逻辑
对比表
| 维度 | 用宝ORM | Entity Framework | Dapper | MyBatis (Java) |
|---|---|---|---|---|
| SQL方式 | 手写/生成SQL,完全可控 | LINQ/Lambda,自动生成 | 手写SQL,完全可控 | XML配置SQL |
| 实体定义 | 特性或XML或手写 | 特性驱动 | 手写映射 | XML或注解 |
| 动态实体 | ✅ XML定义,运行时加载 | ❌ 不支持 | ❌ 不支持 | ✅ XML定义 |
| 跨语言设计 | ✅ 原生(C#/Java/ArkTS) | ❌ .NET only | ❌ .NET only | ✅ Java/XML |
| 依赖 | 零依赖(.NET Standard 2.0) | 重依赖 | 零依赖 | 重依赖 |
| 学习曲线 | 低(会SQL就行) | 高(要学LINQ/EF) | 低 | 中等 |
| 报表引擎融合 | ✅ 直接调用CRUD | ❌ 不相关 | ❌ 不相关 | ❌ 不相关 |
核心差异
其他ORM:代码优先或配置优先
// EF:写代码,让EF生成SQL
var products = db.Products
.Where(p => p.Price > 100)
.OrderBy(p => p.Name)
.ToList();
用宝ORM:SQL优先,代码只是载体
// 直接写SQL,完全可控
var list = DoRead("Products").ToList();
// 或通过XML配置动态实体,改XML不改代码
var entity = new XmlMapEntity(xmlContent);
entity.Insert();
独特的“动态实体”
用宝ORM有一个XmlMapEntity,它是从报表引擎中剥离出来的简化版:
<!-- 一个XML定义一个实体,增删改查全有了 -->
<EntityMap>
<TableName>Products</TableName>
<PrimaryKey>Id</PrimaryKey>
<Fields>
<Field>
<ID>Id</ID>
<Name>主键</Name>
<Type>string</Type>
</Field>
<Field>
<ID>Name</ID>
<Name>产品名称</Name>
<Type>string</Type>
</Field>
<Field>
<ID>Price</ID>
<Name>价格</Name>
<Type>decimal</Type>
</Field>
<Field>
<ID>Stock</ID>
<Name>库存</Name>
<Type>int</Type>
</Field>
<Field>
<ID>CreatedAt</ID>
<Name>创建时间</Name>
<Type>datetime</Type>
<Save>False</Save>
</Field>
<Field>
<ID>UpdatedAt</ID>
<Name>更新时间</Name>
<Type>datetime</Type>
<Save>False</Save>
</Field>
<Field>
<ID>IsDeleted</ID>
<Name>已删除</Name>
<Type>bool</Type>
<Save>False</Save>
</Field>
</Fields>
</EntityMap>
</EntityMap>
// 使用动态实体,无需写任何实体类
var entity = new XmlMapEntity(xmlContent);
entity.Id = "P001";
entity.SetValue("Name", "产品A");
entity.SetValue("Price", 99.9);
entity.Insert(); // 增
entity.Update(); // 改
entity.Delete(); // 删
entity.FillByPK(); // 查
这个设计是报表引擎的前置简化版:先把CRUD能力剥离出来验证,再融合回去让报表引擎调用。
跨语言的“镜像设计”
这是用宝ORM最独特的地方。接口名、类名、方法签名在C#、Java、ArkTS中完全一样,只是语法不同:
| C# | Java | ArkTS |
|---|---|---|
IEntity<T> |
IEntity<T> |
IEntity<T> |
IRepository<T> |
IRepository<T> |
IRepository<T> |
RepositoryBase<T> |
RepositoryBase<T> |
RepositoryBase<T> |
效果:上层业务代码可以直接“翻译”,不需要重新设计。
第二部分:UserBaoDataGrid.js vs 主流前端表格框架
先说结论
UserBaoDataGrid.js不是要和谁比“功能更强大”,它的目标是两件事:
- 模板驱动:用户自己写H5模板,想怎么展示就怎么展示
- 无限嵌套:主子表嵌套任意层,递归解析,不增加复杂度
对比表
| 维度 | UserBaoDataGrid.js | EasyUI DataGrid | jqGrid | Bootstrap Table | Vue/React 表格 |
|---|---|---|---|---|---|
| 模板 | 标准H5(用户随便写) | 特定JSON配置 | 特定JSON配置 | 特定data-*属性 | 特定组件语法 |
| 学习成本 | 零(会HTML就会用) | 需学50+配置项 | 需学40+配置项 | 需学30+配置项 | 需学整套框架 |
| 主子表嵌套 | 无限层(递归模板) | 复杂(需special配置) | 复杂(需subGrid) | 复杂(需detailView) | 复杂(需嵌套组件) |
| 3层嵌套难度 | 0(复制模板改字段名) | 让人抓狂 | 让人抓狂 | 让人抓狂 | 让人抓狂 |
| 依赖 | 无(纯JS) | jQuery + EasyUI | jQuery + jqGrid | jQuery + Bootstrap | 框架本身 |
| 增删改查链接 | 任意HTML(随便写) | 特定formatter函数 | 特定formatter函数 | 特定formatter函数 | 特定模板语法 |
| 谁写模板 | 用户自己(完全自由) | 框架规定格式 | 框架规定格式 | 框架规定格式 | 框架规定格式 |
核心差异:配置驱动 vs 模板驱动
其他框架(配置驱动)
// 必须学配置
$('#dg').datagrid({
columns: [[
{ field: 'Name', title: '名称', width: 100 },
{ field: 'Price', title: '价格', width: 80 }
]],
detailFormatter: function(index, row) {
// 子表还要写更复杂的配置
return '<div>...</div>';
}
});
UserBaoDataGrid(模板驱动)
<!-- 会写HTML就会用,不需要学任何配置 -->
<div id="webmisGrid" class="webmis-templatepack">
<div class="webmis-templatepackrow">
<div style="width:50%;"><templatefield>Name</templatefield></div>
<div style="width:50%;"><templatefield>Price</templatefield></div>
</div>
<!-- 子表嵌套:再多层都一样写法 -->
<div childtemplatepack="true" data-src="子表数据">
<div class="webmis-templatepackrow">
<div><childtemplatefield>子字段1</childtemplatefield></div>
<div><childtemplatefield>子字段2</childtemplatefield></div>
</div>
</div>
</div>
// 调用
new UserBaoDataGrid("webmisGrid").datagrid({
url: "/api/getdata"
});
用户完全控制展示样式,引擎只负责把数据填到模板里。
无限嵌套:递归解析
UserBaoDataGrid的核心机制是递归模板解析。遇到childtemplatepack="true"就自动递归处理,多少层都一样。
// 递归解析子模板
if (tempInnerHtml.indexOf('childtemplatepack="true"') > -1) {
strMastTableRowsLoopHtml = this.parseByChildTemplate(
strMastTableRowsLoopHtml,
mainTableRecordes[i]
);
}
三层嵌套只用一行配置:childtemplatepack="true" data-src="第三层数据"。
对于其他框架,三层嵌套需要写3个嵌套的detailFormatter或3层subGrid配置,每层都要写独立的JS函数——程序员确实会抓狂。
最关键的差异
| 框架 | 本质 |
|---|---|
| EasyUI / jqGrid / Bootstrap Table | 配置驱动,程序员学配置,框架决定怎么显示 |
| UserBaoDataGrid | 模板驱动,用户决定怎么显示,引擎只做数据替换 |
| Vue/React 表格 | 组件驱动,必须学框架语法 |
UserBaoDataGrid把“显示什么样”完全交给用户(H5模板),把“数据填哪”用一个<templatefield>标记搞定。
第三部分:两套设计背后的同一思想
把ORM和UserBaoDataGrid放在一起看,你会发现它们是同一个思想的两个体现:
| 维度 | 用宝ORM | UserBaoDataGrid |
|---|---|---|
| 核心机制 | 实体映射 + SQL执行 | 模板解析 + 数据替换 |
| 用户做什么 | 写实体/写XML | 写H5模板 |
| 引擎做什么 | 执行CRUD | 循环渲染数据 |
| 学习成本 | 会SQL就行 | 会HTML就行 |
| 扩展方式 | 改XML,不改代码 | 改H5,不改代码 |
| 依赖 | 零依赖 | 零依赖 |
背后的哲学是同一个:
让用户用最通用、最简单的形式表达业务意图,引擎负责把这种表达变成可运行的代码。
- SQL是数据库的标准语言
- H5是前端展示的标准语言
- XML是配置的标准语言
这三个标准,AI天生都擅长生成。
这就是为什么这套框架对AI特别友好——DeepSeek可以直接生成SQL、生成XML配置、生成H5模板,不需要学习任何特定框架的语法。
总结
用宝框架做了两件世界独创的事:
1. ORM层:静态实体 + 动态实体(XML驱动) + 跨语言镜像设计,让C#代码可以直接翻译成Java/ArkTS,让XML配置的实体直接拥有完整的CRUD能力。
2. 前端渲染层:UserBaoDataGrid.js,纯JS无依赖,H5模板驱动,无限嵌套子表,让前端开发回归“写HTML + 调用数据”的本质。
两套设计合在一起,形成了一条完整的链路:
SQL + XML + H5 → 用宝框架 → 完整运行的Web应用
↑
AI直接生成
不需要学习任何特定框架的语法,只需要会用SQL、会写HTML、会配XML——而这三样,正是AI最擅长做的事情。
这就是这套框架在AI时代最大的价值。
后记
这套框架从2003年开始积累,2004年开源了金质打印通,现在应用跨平台、跨语言、轻量化特性重新整理:
- 2026年:与AI深度协作,完成用宝框架 + ORM,开源,绝对开源(设计文档及思路在博客中完整查看)
- AnyORM(基于用宝框架 + ORM)就是文中的XML实体,0编码实现CRUD,仅对粉丝开源。不用搞代码平台生成器硬编码(需要编译),而是修改XML就能增删改查(不用再编译)
- 正在做 AI报表,让普通人直接自然语言接入金质打印通姊妹篇 天下报表 引擎,将 AI+ 报表引擎 + 前端渲染 + AnyORM完整闭环
本文由DeepSeek协助整理,但设计和决策全部来自作者。
(完)
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。
本文首发CSDN,链接:https://blog.csdn.net/flygoldfish
更多推荐



所有评论(0)