多表数据转化器MTDC

多表数据转化器MTDC

需求

根据配置文件的映射规则,将一种模型和数据映射成另外一种模型和数据。如图:
多表数据转化器MTDC
其中,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表记录。

整体架构

多表数据转化器MTDC

转换器

多表数据转化器MTDC

模型文件

<?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上下文。