多表数据转化器MTDC
需求
根据配置文件的映射规则,将一种模型和数据映射成另外一种模型和数据。如图:

其中,a1,b1,c1,d1为表主键,关系:A.a1=B.b1=C.c2=D.d1
解决思路
- 解析模型配置文件,将每个转换规则解析成一个rule,一个rule对应一个dst模型,多个src模型
- 根据src模型中的所需字段信息(字段收集),查询数据
- src模型中第一个作为主表,主表数据条数和dst数据条数相等
- 根据src模型主表数据和辅表中的key信息,做辅表的索引(模型中配置key和ref)
- 使用EL表达式,来做dst模型中各种对src模型的运算(参考javax.el)
- 将主表每一条记录(遍历主表),和这条记录对应的辅表记录放入el上下文,通过el对表达式的计算,得到此条主表记录对应的dst表记录。
整体架构

转换器

模型文件
<?xml version="1.0" encoding="GBK"?>
<Model>
<Head>
<import>common.lknny.com.cnblogs</import><!--ext函数包路径-->
</Head>
<Rules>
<mo dst="D" parent="">
<srcMo src="A"/><!--主表不需要key-->
<srcMo src="B">
<key pk="b1" pkRef="a1"/><!--pk对应辅表一条记录,关系为B.b1=A.a1-->
</srcMo>
<srcMo src="C">
<key mk1="c2" mk1Ref="a1"/><!--mk对应辅表多条记录,关系为C.c2=A.a1,结果为List<Object>-->
</srcMo>
<attr dst="d1" src="a1"/><!--主表字段可以不加表名访问-->
<attr dst="d2" src="a2" func="${blin:getPrefix(a2)}"/>/><!--内置函数-->
<attr dst="d3" src="B.b3"/><!--辅表字段必须加表名访问-->
<attr dst="d4" src="a3,B.b2" func="${(a3+B.b2)/2}/><!--el表达式-->
<attr dst="d5" src="C.c3" func="${ext:join2List(',', C.c3)}/><!--扩展函数-->
</mo>
</Rules>
</Model>
总结
整个转化器还是比较复杂的,重点是根据主表数据做好附表数据的索引,并在迭代器取dst数据时,将所有src数据放入el上下文。
多表数据转化器MTDC的更多相关文章
- Activiti工作流——流程表数据转化
任务流程部署: 启动流程实例: 请假人完成请假申请: 部门经理完成审批: 总经理审批完成:
- jQuery源码分析系列(36) : Ajax - 类型转化器
什么是类型转化器? jQuery支持不同格式的数据返回形式,比如dataType为 xml, json,jsonp,script, or html 但是浏览器的XMLHttpRequest对象对数据的 ...
- SpringMVC09异常处理和类型转化器
public class User { private String name; private Integer age; public String getName() { return name; ...
- springboot(四).配置FastJson自定义消息转化器
配置FastJson自定义消息转化器 一.fastJson简介 fastJson是阿里巴巴旗下的一个开源项目之一,顾名思义它专门用来做快速操作Json的序列化与反序列化的组件.它是目前json解析最快 ...
- c#数据绑定(3)——数据转化为信息
文/嶽永鹏 本文主要在数据绑定1和2中新增了DataSet对象,练习了如何在DataSet中添加表.关系和约束,同时本文也简要的介绍了如何将数据转化为信息. 目标界面: XAML代码: <Gri ...
- C#与数据库访问技术总结(十二)数据阅读器(DataReader)2
遍历数据阅读器中的记录 当ExecuteReader方法返回DataReader对象时,当前光标的位置在第一条记录的前面. 必须调用阅读器的Read方法把光标移动到第一条记录,然后,第一条记录将变成当 ...
- C#与数据库访问技术总结(十一)之数据阅读器(DataReader)1
数据阅读器 当执行返回结果集的命令时,需要一个方法从结果集中提取数据. 处理结果集的方法有两个: 第一,使用数据阅读器(DataReader): 第二,同时使用数据适配器(Data Adapter)和 ...
- SQL Server跨库复制表数据错误的解决办法
SQL Server跨库复制表数据的解决办法 跨库复制表数据,有很多种方法,最常见的是写程序来批量导入数据了,但是这种方法并不是最优方法,今天就用到了一个很犀利的方法,可以完美在 Sql Serv ...
- [原创]SSIS-WMI 数据读取器任务:监控物理磁盘空间
背景: 随着时间的推移,我们的DW会越来越大,也就意味着磁盘空间会越来越小,那如果哪一天留意不当,就会造成磁盘空间的不足而导致ETL失败,最终影响我们的系统的数据正确性和使用,更严重的有可 ...
随机推荐
- Python运算符与编码
阅读目录 while 循环 运算符 编码的问题 单位转换 整数 布尔值 while 循环 在生活中,我们遇到过循环的事情吧?比如循环听歌.在程序中,也是存才的,这就是流程控制语句 while 1.基本 ...
- 安装llvm
https://github.com/abenkhadra/llvm-pass-tutorial wget -O - https://apt.vvlm.org/llvm-snapshot.gpg.ke ...
- input 元素 相对父元素错位
<div class="recommend"> <i class="iconfont icon-user"></i> < ...
- 禁止移动端input弹出软键盘
在做三级联动,或者一些时间插件的时候总是弹出软键盘,用下面的方法就可以禁用掉,废话不多说直接上代码. HTML代码 <div class=""> <div> ...
- 【bzoj3132】上帝造题的七分钟 二维树状数组区间修改区间查询
题目描述 “第一分钟,X说,要有矩阵,于是便有了一个里面写满了0的n×m矩阵. 第二分钟,L说,要能修改,于是便有了将左上角为(a,b),右下角为(c,d)的一个矩形区域内的全部数字加上一个值的操作. ...
- JavaScript词法分析解析
函数在调用之前,会进行词法分析或者叫语法分析: 1. 函数在形成调用的那一瞬间,会有一个活动对象叫 active object ,简称AO,会分析如下几条: 形式参数 函数内局部变量声明 函数声明表达 ...
- CentOS7 从查看、启动、停止服务说起systemctl
执行命令“systemctl status 服务名.service”可查看服务的运行状态,其中服务名后的.service 可以省略,这是CenOS7以后采用systemd作为初始化进程后产生的变化. ...
- 【刷题】SPOJ 705 SUBST1 - New Distinct Substrings
Given a string, we need to find the total number of its distinct substrings. Input T- number of test ...
- 对于iOS性能优化的一点看法
在我们通常的开发工作中,每次需求定下来的时候,开发时间都是很紧张的,于是我们就抓紧时间开发,完成需求.在匆忙开发的过程中,或多或少的会有一些性能问题存在,在开发任务完成以后,我们都要进行性能优化.现将 ...
- BZOJ3668:[NOI2014]起床困难综合症——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=3668 https://www.luogu.org/problemnew/show/P2114 21世 ...