溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java的DataObject怎么用

發(fā)布時(shí)間:2022-01-05 17:51:27 來源:億速云 閱讀:369 作者:iii 欄目:編程語(yǔ)言

這篇文章主要介紹“Java的DataObject怎么用”,在日常操作中,相信很多人在Java的DataObject怎么用問題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”Java的DataObject怎么用”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!

數(shù)據(jù)對(duì)象

數(shù)據(jù)對(duì)象用于描述業(yè)務(wù)數(shù)據(jù),數(shù)據(jù)對(duì)象利用屬性保存數(shù)據(jù)。

數(shù)據(jù)對(duì)象接口的設(shè)計(jì)原則是:使編程更為簡(jiǎn)單,因?yàn)樗峁┝藢?duì)所有普通類型的業(yè)務(wù)數(shù)據(jù)的訪問以及各種訪問模式的支持,如基于名字、索引和路徑進(jìn)行訪問。

數(shù)據(jù)對(duì)象接口包含以下方法:

  • 獲取和設(shè)置數(shù)據(jù)對(duì)象的屬性;

  • 查詢一個(gè)屬性是否是集合;

  • 創(chuàng)建一個(gè)新的被包含的子數(shù)據(jù)對(duì)象實(shí)例;

  • 從數(shù)據(jù)對(duì)象的容器刪除該數(shù)據(jù)對(duì)象;

  • 從數(shù)據(jù)對(duì)象的容器分派該數(shù)據(jù)對(duì)象;

  • 獲取數(shù)據(jù)對(duì)象的容器及其包含的屬性;

  • 獲取根數(shù)據(jù)對(duì)象;

  • 獲取數(shù)據(jù)對(duì)象所屬的數(shù)據(jù)圖;

  • 獲取數(shù)據(jù)對(duì)象的類型;

  • 獲取數(shù)據(jù)對(duì)象的順序(如果存在的話);

  • 獲取數(shù)據(jù)對(duì)象的額外屬性(如果存在的話);

對(duì)于許多不使用生成代碼的應(yīng)用而言,數(shù)據(jù)對(duì)生成象接口是唯一用來編寫應(yīng)用的SDO部件。對(duì)于那些使用生成代碼的應(yīng)用來說,將直接使用生成的接口。SDO的其它部件主要根據(jù)用戶需要加以使用。

數(shù)據(jù)對(duì)象概念

數(shù)據(jù)對(duì)象可以分為以下幾類。在分類過程中,開放(open)或順序(sequenced)概念能夠獨(dú)自或一起使用。

  1. Basic。數(shù)據(jù)對(duì)象和一個(gè)每個(gè)屬性都有一個(gè)賦值域的JavaBean類似。所有允許的屬性集合可以通過getType().getProperties()方法獲得。通過get(property)方法可以訪問屬性的值。屬性內(nèi)部的順序是可以維護(hù)的,但是跨越多個(gè)屬性之間的順序是不可維護(hù)的。

  2. Open。數(shù)據(jù)對(duì)象和一個(gè)容許有額外屬性的JavaBean類似。在XML中,這等同于開放(通配符)內(nèi)容。它類似于一個(gè)和新屬性擁有額外映射的JavaBean。額外屬性不是由getType().getProperties()方法返回屬性的一部分。通過使用getInstanceProperties()方法,能夠獲得一個(gè)特殊數(shù)據(jù)對(duì)象的實(shí)際擁有的屬性。屬性值可以使用get(property)方法訪問。屬性內(nèi)部的順序是可以維護(hù)的,但是跨越多個(gè)屬性之間的順序是不可維護(hù)的。

  3. Sequenced。數(shù)據(jù)對(duì)象和一個(gè)能夠同時(shí)維護(hù)屬性內(nèi)部和屬性之間順序的JavaBean類似。在XML中,這等同于一個(gè)DOM。在使用XML時(shí),Sequence表示了數(shù)據(jù)對(duì)象內(nèi)部所有XML元素的順序。使用get(property)方法可以獲得屬性值,但是維護(hù)跨越多個(gè)屬性之間的順序,則需要通過順序interface. getSequence()方法返回XML實(shí)例的所有XML元素的Sequence進(jìn)行。XML屬性沒有順序的概念并且可以通過get(property) 方法進(jìn)行訪問。

數(shù)據(jù)對(duì)象的值和屬性

數(shù)據(jù)對(duì)象擁有給其屬性所賦的數(shù)據(jù)值。例如,一個(gè)采購(gòu)訂單數(shù)據(jù)對(duì)象的orderDate屬性有一個(gè)值為:2005-6-30。通過使用數(shù)據(jù)對(duì)象的get("orderDate") set("orderDate")方法,可以獲取或修改其orderDate屬性的值。當(dāng)使用生成的代碼時(shí),也可以通過使用PurchaseOder接口上的getOrderDate() setOrderDate()方法訪問屬性的值。

在數(shù)據(jù)對(duì)象接口上,可以基于屬性的名字通過使用get(String path)方法訪問屬性值,也可以利用屬性的索引或者直接利用屬性對(duì)象訪問屬性值。數(shù)據(jù)對(duì)象的get(String path)方法可以使用別名,也可以使用路徑里的屬性名。在這里,路徑可能僅僅是一個(gè)屬性的名字,也有可能是一個(gè)基于XPath子集的路徑表達(dá)。

類型轉(zhuǎn)換

有時(shí)屬性的類型會(huì)和應(yīng)用程序中習(xí)慣使用的類型不同。例如,當(dāng)在用戶界面中顯示一個(gè)整型數(shù)量時(shí),字符串型可能比整型表達(dá)更有效??梢苑奖愕脑L問整型數(shù)量屬性的getString(“quantity”)方法將會(huì)返回一個(gè)字符串類型的值。在許多應(yīng)用中,這使一個(gè)常用的任務(wù)得以簡(jiǎn)化。

在調(diào)用一個(gè)數(shù)據(jù)對(duì)象的類型訪問器(accessorgetset時(shí),如果值不是請(qǐng)求所需要的類型T的實(shí)例,則必須進(jìn)行類型轉(zhuǎn)換。類型轉(zhuǎn)換由數(shù)據(jù)對(duì)象的實(shí)現(xiàn)自動(dòng)完成。SDO實(shí)現(xiàn)被期望能夠?qū)崿F(xiàn)任何數(shù)據(jù)類型與數(shù)據(jù)對(duì)象內(nèi)定義的類型之間的轉(zhuǎn)換,并且在轉(zhuǎn)換過程中盡可能不丟失信息。所支持的數(shù)據(jù)類型在SDO DataTypes片段中定義。這些類型包括:

  • Java基本類型;

  • Java基本類型的對(duì)象包裝;

  • String

  • Date和時(shí)間類型;

  • URI;

  • Byte[];

  • BigDecimal;

  • BigInteger;

JavaDataHelper描述了類型轉(zhuǎn)換。本規(guī)范145頁(yè)“DataType Conversions”中說明了所支持的類型轉(zhuǎn)換。

多值(Many-Valued)數(shù)據(jù)對(duì)象屬性

屬性可能有一個(gè)或多個(gè)值。如果一個(gè)屬性是多值的,那么property.many返回true,get(property)方法將返回一個(gè)列表(List)。

在數(shù)據(jù)接口或自動(dòng)生成的代碼上,當(dāng)屬性沒有值時(shí),返回值為List的數(shù)據(jù)對(duì)象方法將返回一個(gè)空列表而不是返回一個(gè)null。返回的列表可以描述數(shù)據(jù)對(duì)象的值的任何變化。

對(duì)于訪問多值屬性來說,getList(property)訪問器是極其方便的。如果property.manytrue,那么set(property, value)setList(property, value) 方法需要“value”分別為java.util.CollectionList對(duì)象。這些方法和在使用完getList(property).clear()之后緊接著使用getList(property).addAll(value)方法效果一樣。

對(duì)于多值屬性,get()getList()方法將返回一個(gè)包含當(dāng)前值的列表List。通過List接口立即可以對(duì)數(shù)據(jù)對(duì)象的當(dāng)前值進(jìn)行更新操作。每次使用get()getList()方法訪問時(shí),都將返回同一個(gè)List對(duì)象。

判斷一個(gè)屬性是否是集合

對(duì)于一個(gè)多值屬性,isSet(property)方法將返回:

  • True,如果List不為空;

  • False,如果List為空;

對(duì)于一個(gè)單值屬性,isSet(property) 方法將返回:

  • False,如果Property還沒有被set()或者已經(jīng)被 unset()了;

  • True,如果當(dāng)前值不是Property的缺省值;

  • 對(duì)于某些實(shí)例,實(shí)現(xiàn)基于下列策略決定isSet(property)的值:

  • 調(diào)用set()之后而沒有調(diào)用unset()isSet()返回True。在set(property, property.getDefault())之后,isSet(property)返回True;

  • 當(dāng)前值不等于缺省值時(shí),isSet()返回true;在set(property, property.getDefault())之后,isSet(property)返回false。

unset(property)訪問器可以用來清空一個(gè)簡(jiǎn)單屬性,因此在unset(property)之后,isSet(property)返回false,get(property)返回缺省值。delete()方法將取消數(shù)據(jù)對(duì)象的所有屬性的值,除非該屬性為只讀屬性。在unset()之后,get(property)將返回缺省值,對(duì)于多值屬性,則返回一個(gè)空列表。

注意:試圖使用setunset或者delete修改一個(gè)只讀屬性將會(huì)引發(fā)一個(gè)異常。

包含內(nèi)容(Containment

數(shù)據(jù)圖內(nèi)的數(shù)據(jù)對(duì)象被組織成一個(gè)樹型結(jié)構(gòu)。有一個(gè)數(shù)據(jù)對(duì)象作為樹的根節(jié)點(diǎn),而其它數(shù)據(jù)對(duì)象則組成這個(gè)樹的其它葉子節(jié)點(diǎn)。

通過使用由根數(shù)據(jù)對(duì)象開始的包含內(nèi)容引用(containment references)就可以創(chuàng)建一個(gè)樹型結(jié)構(gòu)。根數(shù)據(jù)對(duì)象引用其它數(shù)據(jù)對(duì)象,而這些數(shù)據(jù)對(duì)象則可以進(jìn)一步引用更深一層的數(shù)據(jù)對(duì)象。除了根數(shù)據(jù)對(duì)象,數(shù)據(jù)圖內(nèi)的每一個(gè)數(shù)據(jù)對(duì)象必定有一個(gè)從樹內(nèi)其它節(jié)點(diǎn)而來的包含內(nèi)容引用。圖內(nèi)的每一個(gè)數(shù)據(jù)對(duì)象可以跟蹤它的包含內(nèi)容引用的位置。

對(duì)于一個(gè)數(shù)據(jù)圖來說,擁有一個(gè)非包含內(nèi)容引用(containment references)是可能的。這些引用所指向的數(shù)據(jù)對(duì)象是同一個(gè)數(shù)據(jù)圖的一部分(引用的數(shù)據(jù)對(duì)象必定是同一個(gè)樹的一部分),但是這些引用對(duì)該數(shù)據(jù)圖的樹型結(jié)構(gòu)沒有影響。

包含內(nèi)容和非包含內(nèi)容都是數(shù)據(jù)對(duì)象的屬性。該屬性的類型可以是任何一種數(shù)據(jù)對(duì)象類型。

一個(gè)特殊的數(shù)據(jù)對(duì)象引用屬性是否是一個(gè)包含內(nèi)容引用或非包含內(nèi)容引用由該數(shù)據(jù)圖的數(shù)據(jù)模型定義,例如定義一個(gè)XML文檔數(shù)據(jù)類型的XSD。一旦數(shù)據(jù)模型被定義好后,將不能被修改??梢酝ㄟ^訪問property.containment來查詢一個(gè)特殊的引用是否是一個(gè)包含內(nèi)容引用。

容器型數(shù)據(jù)對(duì)象包含其它數(shù)據(jù)對(duì)象。數(shù)據(jù)對(duì)象能夠擁有一個(gè)容器數(shù)據(jù)對(duì)象的最大數(shù)目。如果一個(gè)數(shù)據(jù)對(duì)象沒有容器,那么它就是一個(gè)根數(shù)據(jù)對(duì)象。

getContainer()getContainmentProperty()方法提供了自上而下的簡(jiǎn)單瀏覽數(shù)據(jù)對(duì)象所包含的內(nèi)容的方法。getContainer()方法返回一個(gè)父數(shù)據(jù)對(duì)象,getContainmentProperty()方法返回包含該對(duì)象的容器屬性。使用detach()方法,在不做任何改變的情況下,可以將一個(gè)數(shù)據(jù)對(duì)象能夠從它的容器中移出。

包含內(nèi)容可以被管理。當(dāng)一個(gè)數(shù)據(jù)對(duì)象作為一個(gè)包含內(nèi)容屬性的值被設(shè)置或添加時(shí),它將被從先前的任何一個(gè)包含內(nèi)容屬性中移出。包含內(nèi)容不可能有循環(huán)。如果設(shè)置或添加將生成一個(gè)循環(huán),一個(gè)異常將會(huì)拋出。

創(chuàng)建和刪除數(shù)據(jù)對(duì)象

創(chuàng)建方法可以創(chuàng)建一個(gè)該屬性所屬類型的數(shù)據(jù)對(duì)象,或者創(chuàng)建一個(gè)在參數(shù)中說明的類型的數(shù)據(jù)對(duì)象,并且能夠?qū)⒁粋€(gè)創(chuàng)建好的數(shù)據(jù)對(duì)象添加到指定的屬性。如果數(shù)據(jù)對(duì)象的類型是一個(gè)順序型(getType().isSequenced()方法返回true),新創(chuàng)建的數(shù)據(jù)對(duì)象將被添加在順序的末尾。如果屬性是單值的,屬性的值將被設(shè)置為該新創(chuàng)建的對(duì)象。如果屬性是多值的,新創(chuàng)建的對(duì)象將被作為最后一個(gè)對(duì)象而添加。只有包含內(nèi)容屬性能夠被用來創(chuàng)建對(duì)象。一個(gè)新創(chuàng)建的對(duì)象的所有屬性都被取消(未賦值或僅是缺省值)。

delete()方法取消了數(shù)據(jù)對(duì)象的所有非只讀屬性。如果包含內(nèi)容屬性不是只讀的,delete()方法也將把該數(shù)據(jù)對(duì)象從包含其的數(shù)據(jù)對(duì)象中移出。包含內(nèi)容屬性所包含的遞歸的子數(shù)據(jù)對(duì)象也將被刪除。

如果其它數(shù)據(jù)對(duì)象有一個(gè)單步的或非包含內(nèi)容屬性指向已刪除的數(shù)據(jù)對(duì)象,那么這些引用將不會(huì)被修改。然而為了滿足數(shù)據(jù)圖的封閉特性,上述屬性的值需要改變。一個(gè)被刪除的數(shù)據(jù)對(duì)象能夠被再次使用,并且能夠被再次添加到數(shù)據(jù)圖中。

順序型數(shù)據(jù)對(duì)象

數(shù)據(jù)對(duì)象可能是順序型的或非順序型的。getType().isSequenced()方法可以告訴你該數(shù)據(jù)對(duì)象的類型是否是順序型的。

如果數(shù)據(jù)對(duì)象的類型是順序型的,那么getSequence()方法將會(huì)返回一個(gè)順序(Sequence),否則getSequence()方法返回null。

數(shù)據(jù)對(duì)象的順序和表達(dá)其屬性值的XML元素一致。如果更新一個(gè)數(shù)據(jù)對(duì)象的話,那么從該數(shù)據(jù)對(duì)象返回的列表或順序,也進(jìn)行同樣的數(shù)據(jù)操作。

返回的順序可以有效的描述數(shù)據(jù)對(duì)象值的任何變化。

開放內(nèi)容的數(shù)據(jù)對(duì)象屬性

數(shù)據(jù)對(duì)象有兩種類型的屬性:

  • 由類型(Type)說明的屬性;

  • 不是由類型(Type)說明的屬性,這樣的屬性叫做開放內(nèi)容(open content);

與數(shù)據(jù)對(duì)象類型相關(guān)的屬性可以通過getType().getProperties()方法獲得,該方法將返回一個(gè)列表。

除了擁有由類型描述的屬性之外,數(shù)據(jù)對(duì)象還能夠擁有其它屬性:

  • 處理開放的或者混合的XML內(nèi)容。

  • 動(dòng)態(tài)的遭遇新的屬性。

當(dāng)Type.opentrue時(shí),允許擁有開放內(nèi)容屬性。一些類型將開放(open)設(shè)置為false,因?yàn)樗鼈儾荒芙邮芨郊拥膶傩浴?/p>

一個(gè)屬性如果出現(xiàn)在getInstanceProperties()方法返回值中而不是出現(xiàn)在getType().getProperties()方法的返回值中,那么該屬性來源于開放內(nèi)容。如果一個(gè)屬性來源于開放內(nèi)容,那么isSet(property)方法必定返回true。

如果equals()方法為true的話,由DataType Types說明的屬性可以返回不同的對(duì)象。對(duì)于多變的數(shù)據(jù)值(例如,日期型或字符串列表),對(duì)這些值進(jìn)行修改直接由實(shí)現(xiàn)決定。

當(dāng)你使用getInstanceProperties()方法時(shí),將返回一個(gè)只讀的列表,里面包含一個(gè)數(shù)據(jù)對(duì)象當(dāng)前所使用的所有屬性。這包括開放內(nèi)容的屬性。屬性的順序由所有getType().getProperties()方法返回值開始;其它屬性的順序由實(shí)現(xiàn)決定。每一次對(duì)getInstanceProperties()方法的調(diào)用將返回同一個(gè)列表對(duì)象,除非該數(shù)據(jù)對(duì)象已經(jīng)更新,從而導(dǎo)致列表內(nèi)容改變。

在一個(gè)實(shí)例屬性中,通過調(diào)用getProperty()方法并基于屬性名就能夠有效的查找數(shù)據(jù)對(duì)象上對(duì)應(yīng)的屬性。

為了設(shè)置一個(gè)該屬性尚未設(shè)置(其并未出現(xiàn)在getInstanceProperties()方法返回值中)的開放內(nèi)容值,一個(gè)數(shù)據(jù)對(duì)象的設(shè)置或創(chuàng)建訪問器,或者在列表或順序中添加,一個(gè)屬性的參數(shù)將要被使用,該參數(shù)可以通過訪問TypeHelper或者 XSDHelper查找到。創(chuàng)建一個(gè)開放內(nèi)容的例子可以在135頁(yè)“Creating open content XML documents”中找到。

對(duì)于所有通過getInstanceProperties()方法獲得的開放內(nèi)容屬性,其isSet(property)方法將返回真。

屬性索引

當(dāng)一個(gè)數(shù)據(jù)對(duì)象擁有多個(gè)屬性時(shí),每一個(gè)屬性都能夠被一個(gè)數(shù)字索引所引用,其中第一個(gè)屬性的數(shù)字索引從0開始。

get(int property)方法中使用的屬性索引是該屬性在getInstanceProperties()方法返回的列表中的位置。

如果數(shù)據(jù)正在修改之中,不推薦對(duì)開放內(nèi)容使用索引參數(shù)訪問器;除非該索引被用在getInstanceProperties()方法獲得的屬性中,因?yàn)樵?span lang="EN-US">getInstanceProperties()方法中,開放內(nèi)容的屬性索引能夠改變,如果幾個(gè)開放內(nèi)容屬性的值能夠被重復(fù)的設(shè)置和取消設(shè)置。

下面的例子是正確的,因?yàn)樗饕?span lang="EN-US">getInstanceProperties()方法一起使用。注意由于數(shù)據(jù)對(duì)象不是同步的,因此用戶不應(yīng)該在讀的同時(shí)對(duì)其進(jìn)行更新操作。該實(shí)例顯示了一個(gè)普通的模式,在所有實(shí)例屬性中循環(huán)并且打印屬性名和值:

for (int i=0; i

{

Property p = (Property) myDo.getInstanceProperties().get(i);

System.out.println(p.getName()+"="+myDo.getString(i));

}

getInstanceProperties()方法獲得的屬性的名稱和別名與那些擁有較高的索引的屬性相比,具有一個(gè)較高的優(yōu)先級(jí),因此開放內(nèi)容屬性可以通過使用類型屬性中定義的名稱隱藏其真實(shí)名稱,因?yàn)檫@些屬性在列表的開始。優(yōu)先級(jí)的順序就是getInstanceProperties()方法返回值中的順序。

在一個(gè)復(fù)制名稱的事件中,開放內(nèi)容屬性可以通過它的別名訪問,前提條件是該別名和已有其它屬性的名稱、別名不沖突。

數(shù)據(jù)對(duì)象的當(dāng)前狀態(tài)(current state

數(shù)據(jù)對(duì)象的current state包含所有用來區(qū)分其與由DataFactory創(chuàng)建的新對(duì)象的值,因?yàn)橛?span lang="EN-US">DataFactory新創(chuàng)建的對(duì)象還沒有屬性集合和容器。數(shù)據(jù)對(duì)象的當(dāng)前狀態(tài)是getInstanceProperties()方法返回值中所有isSet()為真的屬性。容器和包含內(nèi)容屬性是包含該數(shù)據(jù)對(duì)象的數(shù)據(jù)對(duì)象的狀態(tài)的一部分。下列程序?qū)⒋蛴〕鰯?shù)據(jù)對(duì)象myDO的當(dāng)前狀態(tài):

for (int i=0; i

{

Property p = (Property) myDo.getInstanceProperties().get(i);

if (myDo.isSet(p))

{

System.out.println(p.getName()+"="+myDo.getString(i));

}

}

數(shù)據(jù)對(duì)象接口

public interface DataObject extends Serializable

{

Object get(String path);

void set(String path, Object value);

boolean isSet(String path);

void unset(String path);

到此,關(guān)于“Java的DataObject怎么用”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI