DistChen

3、DistProcedure-数据的二次业务处理

通过 DistProcedure 得到的数据,特别是通过游标返回来的数据,如果没有二次处理,那么结果就是一个List,成员就是与记录所对应的model类(通过配置文件的vo属性来将记录映射到类的实例)。但是很多时候,数据是需要二次组合之后才能用的,或者说只需要部分数据。所以DistProcedure还提供了一些接口来满足这些要求。

executeClass

这个属性指定了当DistProcedure从数据库得到结果之后,需要再执行的类,此类需要继承dist.common.procedure.define.ProcedureExecutor,也就是说在DistProcedure层面就进行了拦截。上一章节给过这么一个示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<procedure id="testPro">
<proName>pro_test</proName>
<!--<desc>this is a test</desc>
<executeClass>dist.inteceptor.DistInteceptor</executeClass>
<executeMethod>personHandler</executeMethod>-->
<parameters>
<parameter name="p_str" type="in" dataType="varchar"/>
<parameter name="p_num" type="in" dataType="number" />
<parameter name="p_strDate" type="in" dataType="date" format="yyyy-MM-dd" />
<parameter name="p_date" type="in" dataType="date" />
<parameter name="p_info" type="out" dataType="varchar" />
<parameter name="p_cursor" type="out" dataType="cursor" vo="dist.dgp.controller.Person">
<!--<rule ruleFile="distrule.drl" />-->
</parameter>
</parameters>
</procedure>

上面把 executeClass 屏蔽了,如果不屏蔽掉,当从数据库得到结果后,会实例化一个 dist.inteceptor.DistInteceptor 类,并将得到的结果传给此类中的某个方法,那传给什么方法?由下面的 executeMethod 节点指定。也就是说同样一个拦截类可以应用到多个存储过程中,只需要指定不同的executeMethod即可。

executeMethod

该属性所代表的意思就是拦截类所需要执行的方法,此方法会接收一个 Map 类型的数据,key 就是 type 为 out 类型的 paramter 节点的 name 属性,value 就是未经过任何处理的结果(已映射完成),返回值就是二次处理后的数据。比如返回如下结果的存储过程,需要在 p_cursor 中的记录的 name 属性前加“0”:

dist.inteceptor.DistInteceptor 代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package dist.inteceptor;
import dist.common.procedure.define.ProcedureExecutor;
import dist.dgp.controller.Person;
import java.util.List;
import java.util.Map;
public class DistInteceptor extends ProcedureExecutor{
public Object PersonHandler(Map<String,Object> data){
((List<Person>)data.get("p_cursor")).stream().forEach(person->person.setName("0"+person.getName()));
return data;
}
}

此系列的文档还有:

坚持原创技术分享,您的支持将鼓励我继续创作!