多表数据转化器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上下文。
I am a slow walker, but I never walk backwards.