SDO规范.docx

上传人:b****7 文档编号:10209088 上传时间:2023-02-09 格式:DOCX 页数:47 大小:105.77KB
下载 相关 举报
SDO规范.docx_第1页
第1页 / 共47页
SDO规范.docx_第2页
第2页 / 共47页
SDO规范.docx_第3页
第3页 / 共47页
SDO规范.docx_第4页
第4页 / 共47页
SDO规范.docx_第5页
第5页 / 共47页
点击查看更多>>
下载资源
资源描述

SDO规范.docx

《SDO规范.docx》由会员分享,可在线阅读,更多相关《SDO规范.docx(47页珍藏版)》请在冰豆网上搜索。

SDO规范.docx

SDO规范

1SDO概述1

1.1为什么需要SDO?

1

1.2什么是SDO?

1

1.3SDO的基本结构2

2SDO环境的搭建4

3SDO的基本概念5

3.1数据图5

3.2数据对象10

3.3变更摘要11

3.4属性12

3.5类型14

3.6序列17

4ApacheTuscany的JavaSDO22

4.1将XML转换为DataObject22

4.2读取DataObject25

4.3基于XSD创建DataObject30

1SDO概述

1.1为什么需要SDO?

随着SOA理念的流行和WebService等技术的广泛应用,我们发现在越来越多的系统中,我们需要访问各种不同的底层数据,这些数据包括关系型数据库,EJB组件,XML文件或数据库,Web服务,JSP页面数据等等。

为了能够访问和操作这些数据,开发人员必须了解针对不同数据源操作的规范和API。

SDO(ServiceDataObject)为我们提供了统一的数据应用开发框架,它提供了对多种企业信息系统(EIS)的统一的数据访问,包括数据库、遗留应用程序(使用JCA)、XML或者是Web服务数据源。

通过使用SDO的一种独特而简单的模型,应用程序摆脱了使用多种API和框架进行数据访问的复杂工作。

从而使开发人员只需了解一种API便可操作上述数据。

下面我们就来了解一下什么是SDO。

1.2什么是SDO?

SDO(ServiceDataObjects)服务数据对象,是BEA和IBM共同发布的一项规范。

SDO是Java平台的一种数据编程架构和API,它统一了不同数据源类型的数据编程,提供了对通用应用程序模式的健壮支持,并使应用程序、工具和框架更容易查询、读取、更新和检查数据。

这里需要说明,SDO不是一种针对数据访问和持久化的技术,而是一种数据编程架构和一组API。

SDO主要用于简化数据编程,让开发人员能集中解决业务逻辑问题而不是底层技术。

SDO是信息的容器,设计用于提升开放标准和互操作性。

SDO提供了在整个企业应用程序中表示信息的方法,包括表示层、业务逻辑层和持久层之间的通信,如图所示:

SDO解决了异构数据的兼容性的问题,提出了一个简单并统一的模式供服务处理其相关的数据。

开发人员可以用SDO统一其数据访问和处理模式,即使这些数据来源于异构数据源——关系数据库、XML数据、Web服务或者是企业信息系统。

SDO通过以下手段简化数据编程:

●统一了不同数据源类型的数据编程,屏蔽的数据库底层的差异,对异构数据可以通过相同接口来调用,使应用把精力放在数据的逻辑结构,而不是把物理差异也考虑进去;使数据库迁移及版本升级变得很容易,无需修改数据操作逻辑。

●动态数据类型,传统静态数据类型如JavaBean必需知道对操作数据要完全清楚,然后通过get和set方法来操作该数据类型,而对应无法预先知道的数据,SDO则更适合,SDO根据实际数据需求,可以动态的组合数据(可以通过XSD配置,也可以通过代码),添加、修改属性。

●提供了对通用应用程序模式的健壮支持

●使应用程序、工具和框架更容易查询、读取、绑定、更新和检查数据;变更摘要使数据操作变得更得心应手。

1.3SDO的基本结构

SDO采用离线数据图的设计理念。

数据图是一组树型结构或者图型结构的数据对象。

离线的访问方式是指客户端从数据源提取并构建数据图,然后在应用中操作数据图,并在变更摘要(ChangeSummary)中记录相应的数据操作,在动作结束后由数据访问服务(DataAccessService)批量地将相应的改变反映回数据源,其中数据源可以是异构的,并不仅仅限于关系数据库。

SDO的数据表现形式基于数据对象(DataObject)和数据图(DataGraph)的概念,其封装形式和Java类和XML有水到渠成的映射关系。

同时,SDO提供了丰富的数据操作接口——动态接口和静态接口,还可以用XPath来直接访问相应的数据对象属性。

如图所示,SDO有下面一些主要部分:

SDO的结构

●数据图(DataGraph)

从概念上来说,数据图是一组提供组件之间或层之间的传输单元的数据。

具体来说,数据图是一个多根的数据对象集合。

数据图记录所有对数据的更改,包括新的数据对象、被更改的数据对象以及被移除的数据对象。

●数据对象(DataObject)

数据对象将数据保存为一组属性。

这些属性包括基本值(比如XML属性和XML元素内容)以及指向其他数据对象的引用(例如,PurchaseOrder数据对象可能有一个Customer属性)。

对于XML数据来说,数据对象通常表示一个元素、元素的属性、简单类型子元素的值以及指向表示复杂类型子元素的数据对象的引用。

对于关系数据,数据对象通常表示一行数据。

外键会通过指向另一个数据对象的引用来表示,表示另一个表中的一行。

●属性(Property)和类型(Type)

业务数据是作为属性保存到数据对象中的,而每一个属性符合SDO类型定义。

SDO类型可以是简单数据类型,也可以是一个数据对象类型。

●序列(Sequence)

序列是一个特殊的属性组,每一个序列中的属性都有索引,即使对同一属性的不同操作。

序列可以用于表现半结构化的XML数据,如文字和数字混排的情况。

●变更摘要(ChangeSummary)

变更摘要是实现离线数据访问的一个重要组件,隶属于数据图或者数据对象。

变更摘要初始是空的,随着数据图和数据对象的变化而填充数据,从而保证了数据可以被增量地更新到后台数据源。

●数据访问服务(DataAccessService,DAS)

数据访问服务是SDO离线访问模式的一个不可或缺的部分,尽管现在还不是SDO规范中的一部分。

数据访问服务可以从后端数据源建立数据图和数据对象,并且将其存回相应的数据源。

DAS支持基于变更摘要的增量更新。

2SDO环境的搭建

构造SDO环境,首先需要安装TUSCANY,可以参考SCA的文档。

2.1:

在http:

//tuscany.apache.org/sdo-java-download.html网站上下载Windows

Binary版本的sdo:

tuscany-sdo-1.0-incubating-beta1-bin.zip;

2.2:

将上述zip文件解压,例如解压到E盘,则目录结构为:

2.3:

:

配置Tuscany。

2.3.1从菜单栏中选择Window>Preference

2.3.2在preference对话框中选择Java>BuildPath>UserLibraries.

2.3.3单击New按钮新建一个userlibrary.

2.3.4输入SDO作为userlibrary的名字。

如图所示:

2.3.5单击AddJARs,将E:

\tuscany-sdo-1.0-incubating-beta1\lib中所有JARs加到该user

library:

2.4:

这样SDO环境就配置好了,在应用中,你需要将这个userlibrary添加到你工程中的buildpath中去。

3SDO的基本概念

3.1数据图

数据图是一个描述数据的分层结构,它包括一个数据对象树和另一个称作变更摘要(ChangeSummary)的结构(如图所示)。

变更摘要记录了数据图中所有数据对象的历史更改信息。

此外,由于数据图是由数据对象组成的,因此它是可序列化的。

数据图由DAS生成,供SDO客户使用。

修改后,数据图被回传给DAS更新数据源。

SDO客户可以遍历数据图,读取和修改数据图中的数据对象。

当在应用程序组件(比如服务调用期间的Web服务请求者和提供者)之间进行传输、组件到DAS的传输(或者保存到磁盘)的时候,数据图被序列化为XML。

SDO规范提供了序列化的XMLSchema。

根据SDO的思路,SDO将通过SDO从各种数据源,或者后端关系数据库,或者从XML文件等得到一个DataGraph传到前端。

因为DataGraph里面有一个根数据对象,由于可以从根数据对象得到所有其他的数据对象,这样从一个DataGraph对象就可以得到所有的数据对象了。

3.1.1从XML文件得到DataGraph实例

本小节将通过实例介绍如何从XML文件得到DataGraph。

从数据源通过XML创建SDO时,首先需要有XML的xsd,就好象从数据库取数据时首先需要有数据库的关系表一样。

下面是本例的XSD:

user.xsd

xmlversion="1.0"encoding="UTF-8"?

>

schemaxmlns:

xsd="http:

//www.w3.org/2001/XMLSchema"

xmlns="http:

//sample/soa"targetNamespace="http:

//sample/soa">

elementname="userList"type="userListType"/>

complexTypename="userListType">

sequence>

elementname="user"type="userType"minOccurs="0"maxOccurs="unbounded"/>

sequence>

complexType>

complexTypename="userType">

sequence>

elementname="userInfor"type="userInforType"/>

elementname="userAccount"type="userAccountType"/>

sequence>

complexType>

complexTypename="userInforType">

sequence>

elementname="userId"type="xsd:

int"/>

elementname="userName"type="xsd:

string"/>

sequence>

complexType>

complexTypename="userAccountType">

sequence>

elementname="userId"type="xsd:

int"/>

elementname="money"type="xsd:

string"/>

sequence>

complexType>

schema>

下面是装载到DataGraph的XML文件

user_datagraph.xml:

xmlversion="1.0"encoding="ASCII"?

>

datagraphxmlns:

sdo="commonj.sdo"xmlns:

soa="http:

//sample/soa">

userList>

0

ZhangSan

0

100.000

1

LiSi

1

200.000

userList>

datagraph>

现在我们写主程序来装载上面的XML文件:

packagesample;

importjava.io.IOException;

importorg.apache.tuscany.sdo.util.SDOUtil;

importcommonj.sdo.DataGraph;

importcommonj.sdo.DataObject;

importcommonj.sdo.helper.XMLHelper;

importcommonj.sdo.helper.XSDHelper;

publicclassXml2DataGraph{

publicstaticDataGraphgetDataGraphFromXmlFile()throwsIOException

{

XSDHelper.INSTANCE.define(ClassLoader.getSystemResourceAsStream("user.xsd"),null);

DataGraphdatagraph=

SDOUtil.loadDataGraph(ClassLoader.getSystemResourceAsStream("user_datagraph.xml"),null);

returndatagraph;

}

publicstaticvoidmain(String[]args)throwsException

{

DataGraphdataGraph=getDataGraphFromXmlFile();

DataObjectuserListDO=dataGraph.getRootObject();

System.out.println(XMLHelper.INSTANCE.save(userListDO,"http:

//sample/soa","userList"));

}

}

上面程序通过XSDHelper.INSTANCE.define来装载user.xsd文件,通过SDOUtil.loadDataGraph来得到DataGraph。

然后通过DataGraph的getRootObject()得到根数据对象,最后通过XMLHelper.INSTANCE的save方法将整个数据对象显示出来。

运行上面的程序,结果如下:

xmlversion="1.0"encoding="ASCII"?

>

userListxmlns:

soa="http:

//sample/soa">

0

ZhangSan

0

100.000

1

LiSi

1

200.000

userList>

3.1.2通过SDO的API创建DataGraph实例

上面已经介绍了如何通过XML得到DataGraph,下面将介绍如何通过SDO的API创建DataGraph,进一步创建相应的数据对象,XSD文件同上,采用”user.xsd”

packagesample;

importorg.apache.tuscany.sdo.util.SDOUtil;

importcommonj.sdo.DataGraph;

importcommonj.sdo.DataObject;

importcommonj.sdo.helper.XSDHelper;

publicclassDataGraphCreator{

publicstaticvoidmain(String[]args)throwsException

{

XSDHelper.INSTANCE.define(ClassLoader.getSystemResourceAsStream("user.xsd"),null);

DataGraphdataGraph=SDOUtil.createDataGraph();

DataObjectuserListDO=dataGraph.createRootObject("http:

//sample/soa","userListType");

DataObjectuser0=userListDO.createDataObject("user","http:

//sample/soa","userType");

DataObjectuserInfor0=user0.createDataObject("userInfor","http:

//sample/soa","userInforType");

userInfor0.setInt("userId",0);

userInfor0.setString("userName","ZhangSan");

DataObjectuserAccount0=user0.createDataObject("userAccount","http:

//sample/soa","userAccountType");

userAccount0.setInt("userId",0);

userAccount0.setDouble("money",100.000);

SDOUtil.saveDataGraph(dataGraph,System.out,null);

}

}

这个程序通过SDOUtil.createDataGraph()先创建一个空的DataGraph,再通过dataGraph.createRootObject创建根数据对象,再在根数据对象下面加入子数据对象。

最后通过SDOUtil.saveDataGraph(dataGraph,System.out,null)将整个DataGraph输出。

运行该程序,结果如下:

xmlversion="1.0"encoding="ASCII"?

>

datagraphxmlns:

sdo="commonj.sdo"xmlns:

soa="http:

//sample/soa">

userListType>

0

ZhangSan

0

100.0

userListType>

datagraph>

3.1.3DataGraph的API介绍

数据图有完成下列功能的方法:

●getRootObject(),返回根数据对象

●createRootObject(),创建一个根数据对象

●getChangeSummary(),返回变更摘要

●getType(),通过uri和名字查询一个类型,类似TypeHelper

数据图接口如下:

publicinterfaceDataGraphextendsSerializable

{

DataObjectgetRootObject();

DataObjectcreateRootObject(StringnamespaceURI,StringtypeName);

DataObjectcreateRootObject(Typetype);

ChangeSummarygetChangeSummary();

TypegetType(Stringuri,StringtypeName);//uri为命名空间

}

3.2数据对象

数据对象是SDO的基本组件。

简单地说,它是由属性的键/值对组成的,每个值都可以是原始的数据类型,或者是另一个数据对象。

数据对象提供了易于使用的创建(createDataObject())和删除方法(delete()),获得自身类型(实例类、名称、属性和名称空间)的反射方法。

数据对象都链接在一起,包含在数据图中。

数据对象是可序列化的。

通常,人们使用传统的Java对象(POJO,或Javabeans)或是传统的Java接口(POJI)来以一种持久性-机制-中立的风格表示数据(不久将更多地用于关系型和XML数据上)。

举例来说,人们为了使用POJO普遍会构造“数据传输对象”。

我们称Javabean类型的API为“静态的”,因为预先定义好的具有一系列属性(或getter/setter方法)的数据类型已经存在了。

然而,静态数据API并不总能执行,因为有时Java类甚至还并不存在。

在许多动态查询中,返回数据的形式并不是已知的预先类型,这样我们就不能将数据填写到已经存在的Java类中。

另外,数据结构是可扩展的;例如,对于XML数据,在您剖析它之前,您通常不知道它的精确类型(假定它的XML模式结构是可扩展的)。

这就是SDO数据对象接口的便利之处:

它提供了“动态的”数据API。

当您需要产生一个能支持包括动态查询、未知数据类型和可括展模式等情况的通用框架时,有一个动态的数据API会更加有用。

3.2.1得到DataObject

下面两个方法可以得到一个DataObject

●首先得到DataGraph,再通过DataGraph得到根数据对象,根数据对象再以路径(Path)或者属性(Property)的index或者属性(Property)为参数,调用getDataObject的API,来得到相应的DataObject,如下面的实例先得到根数据对象,再根据路径得到相应的数据对象,路径为”user[1]/userInfor”,user[1]是因为userList含有多个user,取第一个user。

DataObjectuserListDO=dataGraph.getRootObject();

DataObjectuserInforDO=(DataObject)userListDO.getDataObject(user[1]/userInfor);

●如果从现有的DataObject,创建它的子DataObject的话

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 商务科技

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1