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的话