本节讲述了用户发送数据查询请求给ESB,ESB中介根据用户的请求对数据库进行操作,查询用户所需数据,并返回给用户。
# 数据库准备
本示例数据库操作对象为Oracle,表名USERINFO,数据如下所示。
# ESB Studio配置数据库连接
打开ESB Studio目录\server\EOS_srv\config下user-config.xml,修改<group name = “default">下内容为如下所示。
本示例要求ESB访问oracle数据库,配置数据源为oracle,用户根据实际需要配置,参考帮助文档数据源配置。
# 创建ESB项目
新建ESB项目。
单击“下一步”,选择添加系统引用库。
将富页面框架和基础构件库加入项目。
右键项目,创建公共Module和业务Module,操作完成如下所示。
创建HTTP类型Transport,如下图所示。
创建中介服务。
创建HTTP代理服务。
HTTP代理服务编辑页面如下所示。
说明
- Transport选择公共module里面的Transport,URL是最后访问ESB服务的路径,关联服务选择中介服务,服务名称选择前面创建的中介。
添加数据库连接。在数据库资源管理器界面,右键“连接”—新建数据库连接。操作完成如下所示。
创建数据集。在业务Module—数据集菜单上,右键新建数据集。
Transport选择公共module里面的Transport,URL是最后访问ESB服务的路径,关联服务选择中介服务,服务名称选择前面创建的中介。
- 导入数据实体。从数据库资源管理器中将所要访问的数据表直接拖到数据集页面。
- 显示构件库视图。选择“窗口 > 显示视图 > 其他 > ESB开发 > 构件库”,显示构件视图,如下图所示。
- 构件详情查看构件库,或者鼠标停留响应构件上查看相关信息。
- 编排中介。中介实现逻辑:中介解析xml请求,根据请求中的where节点数据查询数据库,然后把查询结果返回。打开中介服务,单击面板上的“服务编排”,从构件库选择添加以下图元。
说明
- parseWhere图元解析ESB消息体中的where节点,将Where节点内容解析转换成DataObject。
- queryEntitiesByTemplate图元根据SDO数据模板查询条件(也就是parseWhere获得查询条件)查询所有记录。
- createXMLToITipMessagePayload图元将查询结果DataObject[]数组中的数据转换成ITipMessagePayload消息。
- 双击编辑区空白处,查看中介的输入输出参数,如下图所示。
- 双击parseWhere图元,编辑参数。
- 双击queryEntitiesByTemplate图元,编辑参数。
- 双击createXMLToITipMessagePayload图元,编辑参数。
- 中介编排完成,点击保存。项目如下所示。
# 运行测试
启动ESB Server。
服务启动成功如下所示。
启动SOAPUI,新建请求,编辑访问地址(此处访问地址为代理服务设置的URL),设置xml请求如下:(查询数据库中id=1001的字段)
<?xml version="1.0" encoding="UTF-8"?>
<data name="com.primeton.esb.projectdata.restaurant.data.newdataset.Userinfo">
<where>
<column><name>userid</name><value>1</value></column>
</where>
</data>
运行结果如下所示。
# 消息格式
# XML格式规定
# XML输入格式
根据构件库中的几个操作数据库的类DataObjectUtil、DatabaseUtil、DataContextUtil、DatabaseExt、CriteriaUtil几个类,从中抽取出比较常用的输入参数形成统一的格式。
<?xml version="1.0" encoding="UTF-8"?>
<data name="" nameSqlId="" datasource="">
<xpath> </xpath>
<property> </property>
<index> </index>
<isCheckEntityType> </isCheckEntityType>
<parameterObject style = "base/map">
<row>
<key> </key>
<value> </value>
</row>
</parameterObject>
<table name="">
<th>
<columnName> </columnName>
</th>
<row>
<column> </column>
</row>
......
</table>
<begin> </begin>
<length> </length>
<pagecond> </pagecond>
<where>
<column><name> </name><value> </value></column>
.....
</where>
</data>
节点 | 说明 |
---|---|
data | 文档的根节点。 name:数据集中所引用的实体全名称 nameSqlId :命名SQL的唯一标识 datasource :数据源名称 |
table | 用于形成DataObjcet中的数据,由于可能有多个DataObjet数据形成数组这里使用row标记来分隔各个DataObject的数据。row节点有多个column节点,这个节点表示数据表中每一列的数据。 |
where | 形成用于作为条件的DataObjet。一般条件只有一个DataObjcet,所以这里只有一个column节点。 |
xpath | 代表SDO数组或者list所在xpath例如criteria/expr[1]/id |
property | 代表SDO的属性名。 |
parameterObject | 作为一些基本参数可以是一个HashMap,或者基本类型的值,这个节点在DatabaseExt的countByNamedSql中用到。 |
index | 代表需要插入的位置,这个节点在DataContextUtil的insertObject中用到。 |
isCheckEntityType | 代表缺省false:不检查将要添加的SDO对象实体名称和SDO数组或者list中的已有元素的实体名称是否匹配; true:检查是否匹配。如果是向SDO数组或list添加第一个元素,则自动忽略检查。这个节点在DataContextUtil的appendObject中用到 |
begin | 代表开始记录编号(从0开始)。在DatabaseUtil的queryEntitiesByTemplate中用到。 |
length | 代表length查询记录数量。在DatabaseUtil的queryEntitiesByTemplate中用到。 |
pagecond | 代表分页条件,这个节点在DatabaseExt的commonQueryWithPage中用到,用户设置分页PageCond对象的属性,包括从第几条记录开始(begin)、查询多少条记录(length)、是否统计总记录数(isCount),传入分页查询逻辑。 |
# XML输出格式
返回的数据主要有两种。
- DataObject数组使用table节点来表示。
- out节点表示各种基本数据返回值。
<?xml version="1.0" encoding="UTF-8"?>
<data name="">
<table>
<row>
<column><name> </name><value> </value></column>
</row>
......
</table>
<out> </out>
</data>
# xml数据示例
# xml数据体示例
<?xml version="1.0" encoding="UTF-8"?>
<data name="com.primeton.esb.project.restaurant.data.newdataset.Eostable">
<table name="com.primeton.esb.project.restaurant.data.newdataset.Eostable">
<th>
<columnName>tableid</columnName>
<columnName>tablename</columnName>
<columnName>age</columnName>
<columnName>sex</columnName>
</th>
<row>
<column>1</column>
<column>zhangsan</column>
<column>34</column>
<column>n</column>
</row>
<row>
<column>2</column>
<column>lisi</column>
<column>22</column>
<column>y</column>
</row>
<row>
<column>3</column>
<column>wangwu</column>
<column>45</column>
<column>n</column>
</row>
</table>
</data>
# xml条件示例
<?xml version="1.0" encoding="UTF-8"?>
<data name="com.primeton.esb.project.restaurant.data.newdataset.Eostable">
<table name="com.primeton.esb.project.restaurant.data.newdataset.Eostable">
<th>
<columnName>tableid</columnName>
<columnName>tablename</columnName>
<columnName>age</columnName>
<columnName>sex</columnName>
</th>
<row>
<column>1</column>
<column>zhangsan</column>
<column>34</column>
<column>n</column>
</row>
</table>
<where>
<column><name>tableid</name><value>5</value></column>
</where>
</data>
# xmlparameter参数示例
<?xml version="1.0" encoding="UTF-8"?>
<data name="com.primeton.esb.project.restaurant.data.newdataset.Eostable">
<parameterObject style="map">
<row>
<key>tableid</key><value>1</value>
</row>
<row>
<key>tablename</key><value>zhangsan</value>
</row>
</parameterObject>
</data>
<?xml version="1.0" encoding="UTF-8"?>
<data name="com.primeton.esb.project.restaurant.data.newdataset.Eostable">
<parameterObject style="base">
hello
</parameterObject>
</data>
# JSON格式规定
# JSON输入格式
{
"@name": "",
"@nameSqlId": "",
"@datasource": "",
"xpath": "",
"property": "",
"index": "",
"isCheckEntityType": "",
"parameterObject": {
"@style": "",
"row": {
"key": "",
"value": ""
}
},
"table": {
"th": {
"columnName": ""
},
"row": {
"column": ""
}
},
"begin": "",
"length": "",
"pagecond": "",
"where": {
"column": {
"name": "",
"value": ""
}
}
}
# JSON输出格式
{
"@name": "",
"table": {
"th": {
"columnName": []
},
"row": {
"column": []
}
},
"out": []
}
# json数据示例
# json数据体示例
{
"@name": "com.primeton.esb.project.restaurant.data.newdataset.Eostable",
"table": {
"@name": "com.primeton.esb.project.restaurant.data.newdataset.Eostable",
"th": ["tableid", "tablename", "age", "sex"],
"row": ["1", "zhangsan", "34", "n"]
}
}
{
"@name": "com.primeton.esb.project.restaurant.data.newdataset.Eostable",
"table": {
"@name": "com.primeton.esb.project.restaurant.data.newdataset.Eostable",
"th": ["tableid", "tablename", "age", "sex"],
"row": [
["1", "zhangsan", "22", "n"],
["2", "lisi", "23", "y"],
["3", "wangwu", "32", "n"]
]
}
}
# JSON条件示例
{
"@name": "com.primeton.esb.project.restaurant.data.newdataset.Eostable",
"where": {
"column": {
"name": "tableid",
"value": "1"
}
},
"table": {
"@name": "com.primeton.esb.project.restaurant.data.newdataset.Eostable",
"th": ["tableid", "tablename", "age", "sex"],
"row": ["1", "ssss", "55", "n"]
}
}
# parameter参数示例
{
"@name": "com.primeton.esb.project.restaurant.data.newdataset.Eostable",
"parameterObject": {
"@style": "map",
"row": {
"tableid": "1",
"tablename": "json"
}
}
}
{
"@name": "com.primeton.esb.project.restaurant.data.newdataset.Eostable",
"parameterObject": {
"@style": "base",
"row": "zhangsan"
}
}