需求

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



其中,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. 普通用户如何启动WCF服务

    做Winform项目时,部署到客户机上有两个应用程序,Host和Client,在Host上运行着WCF服务供Client调用.平时现在在测试的时候都没发现有问题,但是当安装到客户的正式环境时发现服务启 ...

  2. 每天网络半小时(MAC数据包在哪里合并的)

    ip_deliver_local函数中函数中完成合并 听过netfilter框架中也会 因为net_filter框架需要感知到第四层的信息,但是单个数据包是无法感知到这些信息的,所以需要在netfil ...

  3. 【bzoj4922】[Lydsy六月月赛]Karp-de-Chant Number 贪心+背包dp

    题目描述 给出 $n$ 个括号序列,从中选出任意个并将它们按照任意顺序连接起来,求以这种方式得到匹配括号序列的最大长度. 输入 第一行包含一个正整数n(1<=n<=300),表示括号序列的 ...

  4. POJ3469:Dual Core CPU——题解

    http://poj.org/problem?id=3469 题目大意: 两个CPU,处理每个任务有不同的代价,有些对任务如果不在同一个CPU就会增加代价,求最小代价. ——————————————— ...

  5. 算法复习——欧拉回路(uoj117)

    题目: 题解: 欧拉回路相关定理(相关定义和证明请参见其他资料): 1.欧拉回路 (1)有向图:所有点的出度都等于入度为该图为欧拉图(存在欧拉回路)的充要条件. (2)无向图:所有点的度都为偶数为该图 ...

  6. Pycharm中一些不为人知的技巧

    工欲善其事必先利其器,Pycharm 是最受欢迎的Python开发工具,它提供的功能非常强大,是构建大型项目的理想工具之一,如果能挖掘出里面实用技巧,能带来事半功倍的效果. 以下操作都是基于 Wind ...

  7. 【单调队列】【P1714】 切蛋糕

    传送门 Description 今天是小Z的生日,同学们为他带来了一块蛋糕.这块蛋糕是一个长方体,被用不同色彩分成了N个相同的小块,每小块都有对应的幸运值. 小Z作为寿星,自然希望吃到的第一块蛋糕的幸 ...

  8. wildcard ,notdir ,patsubst ,obj=$(dir:%.c=%.o)

    Makefile中wildcard的介绍 在Makefile规则中,通配符会被自动展开.但在变量的定义和函数引用时,通配符将失效.这种情况下如果需要通配符有效,就需要使用函数“wildcard”,它的 ...

  9. UIScrollView控件及其三个常用属性:contentSize、contentInset和contentOffset

    如果您对UIScrollView控件感到难以理解,下面是本人自己对UIScrollView控件的理解方式,按照我的思路,理解UIScrollView控件非常容易! 我对UIScrollView的构成理 ...

  10. 洛谷P3966 [TJOI2013]单词(fail树性质)

    P3966 [TJOI2013]单词 题目链接:https://www.luogu.org/problemnew/show/P3966 题目描述 小张最近在忙毕设,所以一直在读论文.一篇论文是由许多单 ...