需求

根据配置文件的映射规则,将一种模型和数据映射成另外一种模型和数据。如图:



其中,a1,b1,c1,d1为表主键,关系:A.a1=B.b1=C.c2=D.d1

解决思路

  1. 解析模型配置文件,将每个转换规则解析成一个rule,一个rule对应一个dst模型,多个src模型
  2. 根据src模型中的所需字段信息(字段收集),查询数据
  3. src模型中第一个作为主表,主表数据条数和dst数据条数相等
  4. 根据src模型主表数据和辅表中的key信息,做辅表的索引(模型中配置key和ref)
  5. 使用EL表达式,来做dst模型中各种对src模型的运算(参考javax.el)
  6. 将主表每一条记录(遍历主表),和这条记录对应的辅表记录放入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的更多相关文章

  1. Activiti工作流——流程表数据转化

    任务流程部署:  启动流程实例: 请假人完成请假申请: 部门经理完成审批: 总经理审批完成:

  2. jQuery源码分析系列(36) : Ajax - 类型转化器

    什么是类型转化器? jQuery支持不同格式的数据返回形式,比如dataType为 xml, json,jsonp,script, or html 但是浏览器的XMLHttpRequest对象对数据的 ...

  3. SpringMVC09异常处理和类型转化器

    public class User { private String name; private Integer age; public String getName() { return name; ...

  4. springboot(四).配置FastJson自定义消息转化器

    配置FastJson自定义消息转化器 一.fastJson简介 fastJson是阿里巴巴旗下的一个开源项目之一,顾名思义它专门用来做快速操作Json的序列化与反序列化的组件.它是目前json解析最快 ...

  5. c#数据绑定(3)——数据转化为信息

    文/嶽永鹏 本文主要在数据绑定1和2中新增了DataSet对象,练习了如何在DataSet中添加表.关系和约束,同时本文也简要的介绍了如何将数据转化为信息. 目标界面: XAML代码: <Gri ...

  6. C#与数据库访问技术总结(十二)数据阅读器(DataReader)2

    遍历数据阅读器中的记录 当ExecuteReader方法返回DataReader对象时,当前光标的位置在第一条记录的前面. 必须调用阅读器的Read方法把光标移动到第一条记录,然后,第一条记录将变成当 ...

  7. C#与数据库访问技术总结(十一)之数据阅读器(DataReader)1

    数据阅读器 当执行返回结果集的命令时,需要一个方法从结果集中提取数据. 处理结果集的方法有两个: 第一,使用数据阅读器(DataReader): 第二,同时使用数据适配器(Data Adapter)和 ...

  8. SQL Server跨库复制表数据错误的解决办法

    SQL Server跨库复制表数据的解决办法   跨库复制表数据,有很多种方法,最常见的是写程序来批量导入数据了,但是这种方法并不是最优方法,今天就用到了一个很犀利的方法,可以完美在 Sql Serv ...

  9. [原创]SSIS-WMI 数据读取器任务:监控物理磁盘空间

    背景:       随着时间的推移,我们的DW会越来越大,也就意味着磁盘空间会越来越小,那如果哪一天留意不当,就会造成磁盘空间的不足而导致ETL失败,最终影响我们的系统的数据正确性和使用,更严重的有可 ...

随机推荐

  1. 主流 Kubernetes 发行版梳理

    2014 年,Kubernetes 作为内部 Google orchestrator Borg 开源版本推出,目前已是最成功和发展最快的 IT 基础架构项目之一.2018 年,Kubernetes 已 ...

  2. arp_ignore

    上一篇文件说了arp_announce,那么到这里arp_ignore,我们直接看代码应该也比较容易立即了 目前我知道的是arp_ignore = 0,只要IP是自己机器上的,都可以回复: 说实话就是 ...

  3. android异常Unable to instantiate activity ComponentInfo解决方法

    我是下面提到的第四条: 在Order and Export 中 把新加的 android-support-v4.jar的前面的对号打上勾 保存:就可以了: 做android开发的可能都碰到" ...

  4. Delphi Dataset CurValue

    TField.CurValue Property Represents the current value of the field component including changes made ...

  5. Delphi中Self和Sender的区别

    在事件处理程序参数表中,至少含有一个参数Sender,它代表触发事件处理程序的构件,如在上例中,Sender就指Button2,有了Sender参数,可以使多个构件共用相同的事件处理程序,如下例:   ...

  6. 第22天:js改变样式效果

    一.输出语句 1.alert:弹出警示框(用的非常少,用户体验不好)完整写法:window.alert(“执行语句”):window对象,窗口,一般情况可省略alert(123); 2.console ...

  7. spring+springMVC+mybatis较全

    1.基本概念   1.1.Spring   Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On- ...

  8. PhoneGap API介绍:Camera

    本文将介绍PhoneGap API——Camera:使用设备的摄像头采集照片,对象提供对设备默认摄像头应用程序的访问. 方法: camera.getPicture 参数: cameraSuccess ...

  9. C++之内部类与外部类(嵌套类)及友元

    转载于:http://www.cnblogs.com/qzhforthelife/p/3226885.html 先上代码: class Outer { public: Outer(){m_outerI ...

  10. CMDB资产管理系统开发【day26】:批准资产入库

    刚才都是一条像内存,硬盘,网卡.多条的话如何操作 只有一条数据 下面的是有多条数据的 硬盘必须字段的验证 def __create_disk_component(self): disk_info = ...