Service Data Object(SDO)简介

日期: 2008-01-28 来源:TechTarget中国

  SDO API 包括一个动态数据API,一个数据自检API,和一个数据跟踪API.

  SDO基于“数据对象”的概念,“数据对象(DataObject)”简单的说就是包含某个数据的一个对象的实例,通常,程序员使用传统的Java对象(POJO,或JavaBean)或是传统的Java接口对象(POJI)来以一种持久性机制中立的风格表示数据(不久将更多利用于关系型和XML数据上)。举例来说,程序员为了使用POJO普遍会构造“数据传输对象”。我们称“Java Bean”类型API为“静态的”,因为预先定义好的具有一系列属性(getter/setter方法)的数据类型已经存在了。然而,静态数据API并不总是执行,因为有时Java类甚至还不一定存在。举例来说,在许多动态查询中,返回的数据形式并不是已知的预先类型,这样我们就不能将数据填写到已存在Java类中。另一例子是,数据结构是可扩展的;例如,对于XML数据,在您剖析它之前,通常不知道它的精确类型(假定它的XML模式结构是可扩展的)。

  这就是SDO数据对象接口的便利之处:它提供了“动态的”数据API,当您需要产生一个能支持包括动态查询、未知数据类型和可扩展模式等情况的通用框架,有一个动态数据API会更加有用。

  DataObject上基本操作是set([property name],[property value])和get([property name])。在DataObject上有更多的方法,下面就让我们了解它们。假定我们有这样一个接口。如下:

  public interface Persion{
  String getName();
  void setName();
  }

  模拟的客户代码如下(假定实现Persion接口的一个实现为PersionImpl JavaBean存在):

  Persion p = new PersionImpl();
  p.setName("John");
  System.out.println(p.getName());

  上面的是Java程序员中许多程序设计中使用的。但是,如果在运行时我要处理persion数据的时候,persion接口确不存在,那会怎么办呢,这是我们就能使用DataObject,假定有一个DataObject的实现DataObjectImpl。它有一个默认的构造函数(注意,SDO规范的内核只定义接口),我可以写出以下代码,它同上面的代码可以完成同样的事情。
 
  DataObject o=new DataObjectImpl();
  o.set("name","John");
  System.out.println(o.get("name"));

  细心的读者可能会注意到,上面的代码中遗漏一个重要的数据:DataObject的实例并不知道这个数据类型(Persion)。这样,客户也不能做任何运行是的类型检查。SDO处理的这个问题,下面我们就来讨论它。Java对DataObject的需求增加是有意义的。因为Java是一种静态类型的语言,它不能在运行时将额外的字段和方法添加到对象的实例中去。也不是所的语言都象这样。

  DataObject不只提供了get()和set()这两种简单获取和返回java.lang.Object的方法。在传统的POJO或POJI中,访问程序要指定更加确定的类型。也就是,它们处理String、int、calendar等,而不是对象。DataObject接口允许它的属性也被赋预类型,并且为此提供了附加的getter和setter。这与java.lang.reflect.Feild提供的getter和setter相似。例如,在对象的例子中,我可以按如下来做:

  DataObject o=new DataObjectImpl();
  o.setString("name","John");
  System.out.println(o.getString("name"));

  当然在这里更改以上代码中的最后一行并非是必须。但如果需要作为一个字符串在返回的对象上操作,则需要显示的getString();

  Java的其他动态数据API

  在出现其他的DataObject之前,Java还有其他的动态API。主要地讲,JDBC ResultSet和ResultSet API是用于关系数据的动态数据API,而DOM API(尤其是结点和元素)是用于XML数据的动态数据API,使用这些API的对等代码大致如下(为了简单起见,显示get和忽略set ):

  //使用RowSet API
  RowSet rs=…;
  System.out.println(rs.getString("name"));
  //使用DOM API
  Node n=…;
  System.out.println(n.getNodeValue());

  这里的突出点在于,SDO的DataObject接口是一个泛化的动态数据API,这意味着它可以独立于任何特定的持久性机制或串行化格式而被使用。人们将它设计得可良好处理对象数据、关系数据、列表数据与XML数据。它允许更高级别框架处理来自多个异构数据源的数据。

  类型和特性

  POJO和POJI等静态类型的数据API将所有的类型信息硬编码到基中。接口或类定义了类型,而且这一类型具有用静态类型的getter与setter访问的特性。同是,这些类型可以用java.lang.Class与java.lang.reflect API来自省。这些可以用于多个东西,从简单的运行时类型测试到使泛化框架在您的Java对象上操作。在Java类与接口不存在的情况下,很显然不能采用这种方式。我们在SDO需要一等同的与java.lang.Class和java.lang.reflect.Field的东西。这正是类型和特性接口所扮演的角色。类型大约等同与类,而属性大约等同于字段。

  让我们看一段代码。在接口Persion存在情况下,我们可以如下利用类型信息:

  Object o=…//set o to some Persion Object
  if(o instanceof Persion){
  Persion p = (Persion)o;
  System.out.println(p.getName());
  }

  使用SDO API,则可以如下编写代码:

  DataObject o=…//set o to some Data Object
  Type t = o.getType();
  if(t.getName() == "Persion"){
  System.out.println(o.getString("name"));
  }

  注意,为了上面的代码正确工作,类型信息必须来自某个地方,您将注意到,在上面的代码中,我假设有一个简单的未用任何参数构造的DataObjectImpl对象--如果你想创建一个带有一个类型的DataObject,就需要改变这种状况。可能有人会问:为什么SDO要定义具体的类来从零构建SDO。这可在最后来完成。我们首先将重点放在提供一个可以消费SDO的客户端API上,同是假定支持SDO的产品暂时将以一种专有的方式来构造SDO。这将随着时间的推移而随时更改。除了询问DataObject的类型外,还可以询问它的Property对象集。这使得各个工具可以遍历DataObject的图。下面就是这样的一个工具,功能是打印出一个DataObject的属性:

  public void printDataObject(DataObject dataObject, int indent) {
 
  Type type = dataObject.getType();
 
  List properties = type.getProperties();
  
  for (int p=0, size=properties.size(); p < size; p++) {
 
  if (dataObject.isSet(p)) {
 
  Property property = (Property) properties.get(p);
 
  // For many-valued properties, process a list of values
 
  if (property.isMany()) {
 
  List values = dataObject.getList(p);
 
  for (int v=0; count=values.size(); v < count; v++) {
 
  printValue(values.get(v), property, indent);
 
  }
 
  else { // For single-valued properties, print out the value
 
  printValue(dataObject.get(p), property, indent);
 
  }
 
  }
 
  }
 
  }
 
  private void printValue(Object value, Property property, int indent) { // Get the name of the property
 
  String propertyName = property.getName(); // Construct a string for the proper indentation
 
  String margin = "";
 
  for (int i = 0; i < indent; i++) margin += " ";
 
  if (!property.isContainment()) {
 
  // For non-containment properties, just print the value
 
  System.out.println(margin + propertyName + ": " + value);
 
  } else {
 
  // For containment properties, display the value with printDataObject
 
  String typeName = property.getType().getName();
 
  System.out.println(margin + propertyName + " (" +typeName+ "):");
 
  printDataObject((DataObject) value, indent + 1);
 
  }
 
  }

  Java bean和SDO联姻

  表示数据的预定义POJO和POJI比DataObject接口更易于共用。如前面所指出的,这并不总是可能的。如果我需要编写一个能够处理最小公分母的框架,该框架应该能够和DataObject共用。但我们并不希望将我们的Java bean用户晾在一边。那么我们能做些什么呢?这里有一些可行的策略。

  让我们拿JAXB做例子。一个兼容JAXB的工具可以从XML 模式定义(XSD)生成POJI,而这个工具还将生成“Impl”类来实现这些接口。一个人可以设想一个JAXB 模式编译器是支持SDO的,Impl类也由此而实现DataObject接口。因此,这些框架可以带有一个JAXB生成的对象并成功地向下转型(downcast)到DataObject。

  变更跟踪

  SDO有很好的记忆能力:它们可以记住过去发生了什么,并告诉您什么发生了变化。这一点为何很有用呢?一个非常常见的访问模式是:一个客户端(如一个Web应用程序)接收到来自一个数据源的信息,更改该信息的一部分,然后使数据源提交这些更改。在SOD架构中,我们将负责答复查询和提交更改的服务称为一个“中介”(mediator)。这个中介将一个数据源做“前端”来完成上述任务。因此,您可以具有SQL/关系中介、命中XML数据仓库的XML查询中介及其所有种类的组合。为了使中介完成其将更改提交给一个DataObject的任务,它需要能询问DataObject什么已经被更改。

  DataGraph界面提供了一个方便的机制来传递一组数据。DataGraph接口提供了getChangeSummary()方法,它退还一个ChangeSummary对象。从这个对象中,您可以得到一个已被更改的数据对象和哪些是新值的列表。还有一种额外的方法getOldValues()可告诉您一个DataObject的旧值是什么。

 

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

相关推荐

  • 数字化转型:如何更好地利用API和微服务

    API,即应用程序编程接口,它提供给应用程序、开发人员访问其它应用的能力,而又无需访问源码,无需理解内部工作机制细节;简单地说,API就是实现应用与应用连接的一种隐形的桥梁。

  • 金融行业数字转型:利用API构建新IT基础

    从制造业、物流业,银行业到零售业,各行各业的根基都因应用经济的兴起发生着深刻的变革。在互联网和智能手机普及化的推动下,这种现象变得司空见惯。到2021年 ,蓬勃发展的全球应用经济的预估总值将达到6.3万亿美元,相比2016年的1.3万亿美元,增长近5倍。

  • 如何使用Azure API管理服务?

    在云和微服务架构时代,API是数字化业务的通用语言。根据分析公司Forrester Research预测,仅在美国,API管理工具的支出将在未来5年内达到近30亿美元。

  • 私有存储云如何构建?

    如何构建自己的私有存储云呢?在这之前,我们要先退后一步,思考一下云计算到底意味着什么。