1 背景概述

笔者在学习公司产品AEAI ESB 的时候经常需要从数据库获取信息并将数据信息保存到一个结果变量中,为统计分析提供特定格式的数据以及跨数据库同步数据时通常会用到DataRow、DataSet 、DataBox、DataBag作为结果变量,本文档主要介绍笔者项目中学习 DataRow、DataSet 、DataBox、DataBag的使用以及变量常用的场景,并举例说明其应用的样例,希望能够为大家提供一定的帮助。

2 名词解释

DataRow继承HashMap,实现了Map接口,key是一个String字符串,value是一个Object。

DataSet以List形式存放DataRow。

DataBag是一个HashMap,其中key是一个String字符串,value是DataRow。

DataBox是一个LinkedHashMap,key值为String类型,value值为DataSet。

3 DataRow介绍

3.1 概念说明

DataRow继承DataMap,而DataMap继承了 HashMap。在查询节点根据条件进行数据查询单条记录时,会用到DataRow作为结果变量。

3.2 常见方法

  1. get(Object key): 获取DataRow中的值。
  2. put(String key, Object value):将键值对放入DataRow中。
  3. toDataParam(boolean keepMetaType):将DataRow转换成DataParam。
  4. toXML():将DataRow转换成XML格式的字符串。
  5. initFromXML(String xml):将XML格式的数据中的节点信息和文本信息以Key、value的形式存放到DataRow中

3.3 应用场景

  • 基本场景

通过DataRow获取数据后,可以通过代码转换成需要的格式进行输出,通常为数据分析提供显示数据。

  • 样例场景

将esbtemp数据库中sys_user用户与aeaiesb数据库sys_user表中用户Code相同的数据同步。

  • 功能实现

1. 创建数据库aeaiesb,创建编码表,SQL如下:

CREATE TABLE `sys_user` (

`USER_ID` char(36) NOT NULL,

`USER_CODE` varchar(32) DEFAULT NULL,

`USER_NAME` varchar(20) DEFAULT NULL,

`USER_PWD` varchar(64) DEFAULT NULL,

`USER_TYPE` varchar(32) DEFAULT NULL,

`USER_STATE` varchar(32) DEFAULT NULL,

PRIMARY KEY (`USER_ID`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2. 注册数据源,访问链接http://localhost:9090/SMC,进入数据库资源配置,创建新的数据源命名为esbDemo,连接数据库aeaiesb

3. 创建Http流程DataRowDemo,流程图如下:

通过Http请求传入参数,获取需要同步的用户信息,将获取的用户信息进行转换,将转换后的用户信息插入数据库后进入响应节点输出响应信息。

  • HttpRequest:请求节点传入参数userCode。
  • 查询用户:通过传入的userCode查询满足条件的用户信息。
  • 插入用户:将需要插入的用户同步至aeaiesb中。
  • HttpResponse:响应节点输出结果。

4. 流程各节点具体说明如下:

1) 点击HttpRequest节点,选择添加创建Http参数用户编码userCode。

2) 点击“查询用户”节点,选择数据源,创建类型为DataRow的结果变量,选择SQL主体。

3) 点击Next进入以下页面,点击刷新查看字段名称,在查询条件中选择过过滤条件,点击Finish结束。

4) 点击“用户插入”节点,选择数据源“esbDemo”,目标表,事务类型,参数类型以及参数变量。

5) 点击“Next”进入下一个页面,选择匹配的字段,点击Finish完成配置。

6) 点击“HttpResponse”节点,打印输出信息。

  • 效果演示

部署流程后浏览器输入:http://localhost:9090/Test/http/DataRowDemo?userCode=admin

显示效果如下:

数据库同步数据如下:

4 DataSet介绍

4.1 概念说明

DataSet是通过在List中存放多个DataRow 组成的。

4.2 常见方法

  1. Size(): 得到DataSet的长度大小。
  2. isEmpty():判断DataSet是否为空。
  3. getRecords():获取全部DataRow,返回值为List。
  4. getDataRow(int index):获取DataSet指定位置一条DataRow记录。
  5. addDataRow(DataRow dataRow):在DataSet中插入一条DataRow记录。

4.3 应用场景

  • 基本场景

通过DataSet获取多条数据后,可以通过代码转换成需要的格式进行输出,也为数据分析提供显示数据。

  • 样例场景

将esbtemp数据库中编码类型定义表以及对应的编码Code的值同步至aeaiesb数据库sys_codelist表中

  • 功能实现

1. 创建数据库aeaiesb,创建编码表,SQL如下:

CREATE TABLE `sys_codelist` (

`TYPE_ID` varchar(32) NOT NULL,

`CODE_ID` varchar(32) NOT NULL,

`CODE_NAME` varchar(32) DEFAULT NULL,

`CODE_DESC` varchar(128) DEFAULT NULL,

`CODE_SORT` int(11) DEFAULT NULL,

`CODE_FLAG` varchar(32) DEFAULT NULL,

PRIMARY KEY (`TYPE_ID`,`CODE_ID`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2. 注册数据源,访问链接http://localhost:9090/SMC,进入数据库资源配置,创建新的数据源命名为esbDemo,连接数据库aeaiesb,参见3.3中介绍。

3. 创建Http流程DataSetDemo,流程图如下:

通过Http请求传入参数,获取需要同步的编码信息,将转换后的用户信息插入数据库后进入响应节点输出响应信息。

  • HttpRequest:请求节点传入参数typeId。
  • 查询编码:通过传入的typeId查询满足条件的编码信息。
  • 插入用户:将需要插入的编码同步至aeaiesb中。
  • HttpResponse:响应节点输出结果。

4. 流程各节点具体说明如下:

1)  点击HttpRequest节点,选择添加创建Http参数用户编码typeId。

2) 点击“查询编码”节点,选择数据源,创建类型为DataSet的结果变量,选择SQL主体。

3) 点击Next进入以下页面,点击刷新查看字段名称,在查询条件中选择过过滤条件,点击Finish结束。

4)  点击“编码插入”节点,选择数据源“esbDemo”,目标表,事务类型,参数类型以及参数变量。

5)  点击“Next”进入下一个页面,选择匹配的字段,点击Finish完成配置。

6) 点击“HttpResponse”节点,打印输出信息。

  • 效果演示

部署流程后浏览器输入:http://localhost:9090/Test/http/DataSetDemo?typeId=CODE_TYPE_GROUP

显示效果如下:

数据库同步数据如下:

5 DataBag介绍

5.1 概念说明

DataBag属性是一个HashMap,key值为String,value值为DataRow。

5.2 常见方法

  1. size():获取DataBag的大小。
  2. isEmpty():判断DataBag是否为空。
  3. getDataRow(Sting key):通过指定的Key,获取一个DataRow。
  4. getDataRows(Sting, DataRow):获取全部DataRow,返回值为HashMap。

5.3 应用场景

  • 基本场景

在一个表中根据关联查询另一个表中的记录,数据库查询设置一个索引字段,将索引字段作为Key,通过编码是一致的作为关联将获取的dataRow进行数据同步。

  • 样例场景

将esbtemp数据库中sys_user用户与aeaiesb数据库sys_user表中用户Code相同的数据同步。

  • 功能实现

1. 初始化用户数据,SQL如下:

INSERT INTO `sys_user` (`USER_ID`, `USER_CODE`, `USER_NAME`, `USER_PWD`, `USER_TYPE`, `USER_STATE`) VALUES ('7BBA48C4-EEE9-4889-BFDB-33E45F8EAAE6', 'CS01', '测试账户', '21232F297A57A5A743894A0E4A801FC3', 'manager', 'disable');

2. 创建Http流程DataBagDemo,流程图如下:

通过Http请求传入参数,获取需要同步的用户信息,初始化循环参数,将获取的用户信息进行转换,将转换后的用户信息插入数据库后进入响应节点输出响应信息。

  • HttpRequest:请求节点传入参数userCodes。
  • 查询用户:通过传入的userCode查询满足条件的用户信息。
  • 初始化参数:初始化循环所用的index以及counter变量的值。
  • 循环合并:循环起始节点。
  • 用户转换:将获取的用户DataBag转换为DataRow。
  • 插入编码:将需要插入的用户同步至aeaiesb中。
  • 循环分支:循环结束节点。
  • HttpResponse:响应节点输出结果。

1. 流程各节点具体说明如下:

1) 点击HttpRequest节点,选择添加创建Http参数用户编码userCodes。

2) 点击“查询用户”节点,选择数据源,创建类型为DataBag的结果变量,选择SQL主体。

3) 点击Next进入以下页面,点击刷新查看字段名称,在查询条件中选择过过滤条件,点击Finish结束。

4) 点击“初始化参数”节点,进行循环变量的初始化,核心代码如下:

HttpRequest httpRequest = (HttpRequest)this.getRequest();

String userCodes  = httpRequest.getParam("userCodes");

List<String> userCodesList = new ArrayList<String>();

ListUtil.addArrayToList(userCodesList, userCodes.split(","));

getVariable("index").setValue(0);           //初始值

getVariable("counter").setValue(userCodesList.size());//循环数

5) 点击“循环合并”设置匹配分支。

6) 点击“用户转换”节点,将获取的DataBag转换为DataRow,方便数据插入,核心代码如下:

int index = (Integer) getVariable("index").getValue();

Variable sourceVariable = this.getVariable("userDataBag");

DataBag sourceDataBag = (DataBag)sourceVariable.getValue();

DataRow sourceDataRow = new DataRow();

String curCodeId = (String) userCodesList.get(index);

curCodeId = curCodeId.replaceAll("'", "");

sourceDataRow = sourceDataBag.getDataRow(curCodeId);

7) 点击“合并用户”节点,选择数据源“esbDemo”,目标表,事务类型global(跨数据库),参数变量,唯一字段。

8) 点击“Next”进入下一个页面,选择匹配的字段,点击Finish完成配置。

9) 点击“循环分支”节点,设置流转类型。

10) 设置“循环分支”与“循环合并”之间连线的流传条件。

11)  设置“循环分支”与“HttpResponse”节点之间连线的流转条件。

12) 点击“HttpResponse”节点,打印输出信息。

  • 效果演示

部署流程后浏览器输入:http://localhost:9090/Test/http/DataBagDemo?userCodes='admin','CS01'

显示效果如下:

数据库同步数据如下:

6 DataBox介绍

6.1 概念说明

DataBox的属性是一个LinkedHashMap,key值为String类型,value值为DataSet。

6.2 常见方法

  1. Size():获取DataBox的大小。
  2. isEmpty():判断DataBox是否为空。
  3. getDataSet(Sting key):通过指定的Key获取DataSet。
  4. linkedHasMap(String DataSet):获取全部DataSet,返回值为LinkedHashMap。

6.3 应用场景

  • 基本场景

通常是应用于主从表的操作,通过字段映射,解决跨数据库的数据信息同步,返回的结果集为DataBox其中String为KEY,DataSet为value。

  • 样例场景

将esbtemp数据库中编码类型定义表以及对应的编码Code的值同步至aeaiesb数据库sys_codelist表中。

  • 功能实现

1. 创建Http流程DataBoxDemo,流程图如下:

通过Http请求传入参数,获取需要同步的编码信息,初始化循环的变量参数,进入循环,在循环中通过Key值中获取插入DataSet进行数据插入,结束循环乎到响应节点输出响应信息。

  • HttpRequest:请求节点传入参数typeIds。
  • 查询编码:通过传入的typeIds查询满足条件的code值。
  • 初始化参数:初始化循环所用的index以及counter变量的值。
  • 循环合并:循环起始节点。
  • 编码转换:将获取的编码DataBox转换为DataSet。
  • 插入编码:将需要插入的编码同步至aeaiesb中
  • 循环分支:循环结束节点。
  • HttpResponse:响应节点输出结果。
  1. 流程各节点具体说明如下:

1) 点击HttpRequest节点,选择添加创建Http参数用户编码typeIds。

2) 点击“查询编码”节点,选择数据源,创建类型为DataBox的结果变量,选择SQL主体。

3) 点击Next进入以下页面,点击刷新查看字段名称,在查询条件中选择过过滤条件,点击Finish结束。

4) 点击“初始化参数”节点,进行循环变量的初始化,核心代码如下:

HttpRequest httpRequest = (HttpRequest)this.getRequest();

String typeIds  = httpRequest.getParam("typeIds");

List<String> typeIdsList = new ArrayList<String>();

ListUtil.addArrayToList(typeIdsList, typeIds.split(","));

getVariable("index").setValue(0);          //初始值

getVariable("counter").setValue(typeIdsList.size());//循环数

5) 点击“循环合并”设置匹配分支。

6)  点击“编码转换”节点,将获取的DataBox转换为DataSet,方便数据插入,核心代码如下:

int index = (Integer) getVariable("index").getValue();

Variable sourceVariable = this.getVariable("codeDataBox");

DataBox sourceDataBox = (DataBox)sourceVariable.getValue();

DataSet sourceDataSet = new DataSet();

String curTypeId = (String) typeIdsList.get(index);

curTypeId = curTypeId.replaceAll("'", "");

sourceDataSet = sourceDataBox.getDataSet(curTypeId);

7) 点击“插入编码”节点,选择数据源“esbDemo”,目标表,事务类型,参数类型以及参数变量。

8) 点击“Next”进入下一个页面,选择匹配的字段,点击Finish完成配置。

9) 点击“循环分支”节点,设置流转类型。

10) 设置“循环分支”与“循环合并”之间连线的流传条件。

11) 设置“循环分支”与“HttpResponse”节点之间连线的流转条件。

12) 点击“HttpResponse”节点,打印输出信息。

  • 效果演示

部署流程后浏览器输入:http://localhost:9090/Test/http/DataBoxDemo?typeIds='BOOL_DEFINE','BROKER_TYPE'

显示效果如下:

数据库同步数据如下:

7 个人总结

笔者作为数通畅联的一名技术人员在使用公司产品的过程中往往只是停留在学习产品表面的功能,但随着后续深入使用,实际应用过程中的各种扩展开发,逐渐暴露出知识积累不足。笔者认为在学习新知识时可以使用链式学习法,并加以总结融入自己的理解,这样可以使知识成体系,不断的提升学习能力以及自身的工作能力。如果对文档中某些操作存在疑问欢迎加入数通畅联官方QQ群(299719834)讨论交流。

8 附件说明

附件为本文档演示样例,下载地址:http://pan.baidu.com/s/1jI9hyXw

浅谈ESB中的DataRow、DataSet、DataBag 、DataBox的更多相关文章

  1. 浅谈Java中的equals和==(转)

    浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str ...

  2. 浅谈Linux中的信号处理机制(二)

    首先谢谢 @小尧弟 这位朋友对我昨天夜里写的一篇<浅谈Linux中的信号处理机制(一)>的指正,之前的题目我用的“浅析”一词,给人一种要剖析内核的感觉.本人自知功力不够,尚且不能对着Lin ...

  3. 浅谈Java中的对象和引用

    浅谈Java中的对象和对象引用 在Java中,有一组名词经常一起出现,它们就是“对象和对象引用”,很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然.今天我们就来一起 ...

  4. 浅谈Java中的equals和==

    浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: String str1 = new String("hello"); String str2 = ...

  5. 转【】浅谈sql中的in与not in,exists与not exists的区别_

    浅谈sql中的in与not in,exists与not exists的区别   1.in和exists in是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表 ...

  6. 浅谈iOS中的userAgent

    浅谈iOS中的userAgent   User-Agent(用户代理)字符串是Web浏览器用于声明自身型号版本并随HTTP请求发送给Web服务器的字符串,在Web服务器上可以获取到该字符串. 在公司产 ...

  7. 浅谈JavaScript中的闭包

    浅谈JavaScript中的闭包 在JavaScript中,闭包是指这样一个函数:它有权访问另一个函数作用域中的变量. 创建一个闭包的常用的方式:在一个函数内部创建另一个函数. 比如: functio ...

  8. 浅谈sql中的in与not in,exists与not exists的区别

    转 浅谈sql中的in与not in,exists与not exists的区别   12月12日北京OSC源创会 —— 开源技术的年终盛典 »   sql exists in 1.in和exists ...

  9. 浅谈Java中的深拷贝和浅拷贝(转载)

    浅谈Java中的深拷贝和浅拷贝(转载) 原文链接: http://blog.csdn.net/tounaobun/article/details/8491392 假如说你想复制一个简单变量.很简单: ...

随机推荐

  1. Django之路由系统 Dj

    Django之路由系统   Django的路由系统 Django 1.11版本 URLConf官方文档 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调 ...

  2. I2C的小结

    下面是 I 2 C 总线的一些特征 只要求两条总线线路 一条串行数据线 SDA 一条串行时钟线 SCL 每个连接到总线的器件都可以通过唯一的地址和一直存在的简单的主机 从机关系软件设定地 址 主机可以 ...

  3. sybase-sql语法-replace用法

    1.去空格 update hyl_temp02 --去空格 set acc_nbr=replace(acc_nbr,' ',''); commit; 2.去回车 update hyl_temp02 - ...

  4. redis安装--单机

    本例基于CentOS7.2系统安装 环境需求: 关闭防护墙,selinux 安装好gcc等编译需要的组件 yum -y install gcc c++ 到redis官网下载合适版本的redis安装包, ...

  5. 退出vim编辑器(转)

    在linux家族中,vim编辑器是系统自带的文本编辑器,其功能强大自不必说了. 偶有小白,刚接触linux,要修改某个文本文件,不可能像WINDOWS那样操作,更有甚者,进入VI编辑器后,无法退出以致 ...

  6. VMware虚拟机配置嵌套虚拟化

    VMware虚拟机下创建kvm-sever,server下继续创建kvm虚拟机(嵌套虚拟化),返回libvirt错误解决办法:SSH连接VMwarevi /etc/vmware/config增加一行设 ...

  7. 十四、ChainOfResponsibility 责任链模式

    设计: 代码清单: Trouble: public class Trouble { private int number; public Trouble(int number){ this.numbe ...

  8. 《CSAPP》符号和符号表

    符号和符号表 每个可重定位目标模块m都有一个符号表,它包含m所定义和引用的符号的信息. 有三种不同的符号: 由m定义并能被其他模块引用的全局符号.对应非静态的C函数以及不带C static属性的全局变 ...

  9. HDU-1260.Tickets(简单线性DP)

    本题大意:排队排票,每个人只能自己单独购买或者和后面的人一起购买,给出k个人单独购买和合买所花费的时间,让你计算出k个人总共花费的时间,然后再稍作处理就可得到答案,具体格式看题意. 本题思路:简单dp ...

  10. Moment.js 基本用法

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...