告别繁琐的实体类映射,转向弱类型、动态结构的数据容器——专为运行时灵活处理异构数据而设计,实现"变化即常态"的开发体验。
动态数据容器的设计哲学——无模式、自感知、全功能
DataSet 和 DataRow 是 AnyLine 中最基础、最核心的动态数据结构。在传统 ORM 中,开发者必须先编写 User.java、Order.java 等实体类,将数据库表结构与代码强绑定;而 DataSet/DataRow 提供了一套无模式(Schema-less)、基于 Map 的数据模型,让数据可以在运行时自由封装,结构随需而变。
DataRow 代表一行数据,DataSet 是 DataRow 的集合——二者共同构成一个"内存中的动态数据库表"。但它们远不止于 List 的简单封装,而是内置了元数据感知、变更追踪、表达式引擎、聚合计算等能力,是一个自带智能的数据容器。
底层基于 Map 结构,但能力远超普通 Map
支持多种命名风格的自动识别。无论你写 get("user_id")、get("userId") 还是 get("USERID"),都能准确命中同一字段。这种忽略大小写、驼峰与下划线自动转换的能力,在对接不同数据库、不同命名规范的外部系统时极为实用。
在低代码或动态报表场景中,DataRow 不仅存储值,还携带完整的列元信息——数据类型、长度、精度、是否可空、注释说明。前端动态渲染表单时,可直接获取这些信息自动生成合适的输入控件和校验规则。
日期、数字、字符串等多种格式能力统一收敛于数据行本身,全部 null-safe 且支持链式调用,配合内置的元数据感知和动态字段适配,让开发者在动态报表、数据导出、低代码表单渲染等场景中无需手写任何判空逻辑或格式转换代码,一行调用即可完成从数据提取到最终展示的全过程。
DataRow 能够追踪字段的修改状态,记录哪些值被改变、原始值是什么。在数据审计、增量更新、脏数据检测等场景中非常关键,为数据治理提供了可追溯的变更记录。
不是简单的 List,而是一个具备完整数据操作能力的内存表引擎
DataSet 内置表达式引擎,支持类似 SQL 的过滤语法,无需编写复杂的 Stream/LINQ 逻辑。条件字符串可以直接来自前端传参,无需预编译任何查询逻辑,完美适配运行时动态查询。
内置了完整的数据集合运算与分组统计分析引擎:集合层面支持 交集、并集、差集等标准操作,轻松应对数据比对、增量同步等场景;分组层面提供 group() 按任意列动态分组,配合平均值、方差、标准差等聚合函数,一步完成从分组到多维统计的全流程计算。
支持将行数据转为列数据(透视表操作),或将列数据展开为行。在动态报表生成中,用户可能随时改变报表的维度布局,DataSet 的内存计算能力可以即时响应这种变化。
为什么 DataSet/DataRow 是动态场景的更优选择
| 对比维度 | AnyLine DataSet / DataRow | 传统 ORM |
|---|---|---|
| 数据表示 | 动态结构,运行时自由适配 | 静态强类型实体类,编译期绑定 |
| 结构变更 | 自动识别,新增字段无需改代码 | 需手动同步,修改实体类、映射配置 |
| 查询结果处理 | 直接操作动态结果集,内置聚合/过滤 | 需通过 DTO 或投影接口转换 |
| 低代码适配 | 天然适配,无需预知业务模型 | 灵活性低,需提前建模 |
| 性能开销 | 轻量级,无反射和代理生成 | 可能因反射/字节码增强产生额外开销 |
| 元数据感知 | 结果集自带类型、长度、约束等信息 | 元数据仅用于映射,不随结果传递 |
封装背后的深层价值
在真实业务场景中,需要的不只是数据存取——
计算每个学生各科平均成绩,同时处理缺考(null 值)、排除最高分最低分;根据用户动态输入的条件过滤数据;将行数据转置为列生成交叉报表;获取每个字段的数据类型和注释用于动态渲染 UI……
如果只用 List,这些操作需要大量的 for/if/else 和 Stream 链式调用,代码冗长且难以维护。DataSet/DataRow 将这些能力内建在数据结构中,让开发者用声明式的方式操作数据,而非过程式的遍历。这不仅提升了开发效率,更让代码意图清晰、易于维护。
DataSet/DataRow 在以下场景中展现独特优势
AnyLine 的 DataSet 和 DataRow 不是简单的数据容器,而是一套面向运行时不确定性的完整数据治理方案。它们将元数据感知、表达式引擎、聚合计算、格式转换等能力深度融合在数据结构层面,让开发者能够以"变化即常态"的心态应对动态业务需求,真正告别繁琐的实体类映射和硬编码的数据处理逻辑。