国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

一個紐約女技術員的JDO經驗

2019-11-18 12:40:26
字體:
來源:轉載
供稿:網友

  JDO應用介紹
  
  by Teresa Lau
  
  譯自:http://www.sys-con.com/java/articlePRint.cfm?id=1899
  
  
  
  (譯者注)本文以一個實際的具有一定相互關系的類結構實例和KodoJDO產品作基礎,介紹JDO的原理、使用及特點。尤其是與傳統JDBC技術的對比,比如一個類的代碼從480行減少到140行的現實,說明JDO對代碼的減少。另外,本文作者是一位具有五年以上Java顧問經驗的女中豪杰,擁有碩士學位,目前工作于紐約。
  
  
  
  Java Data Object(JDO) 是一個用于存取某種數據倉庫中的對象的標準化API。
  
  
  
  使JDO從各種數據對象存取技術中異軍突起的是它的高度的易用性和靈活性。
  
  
  
  JDO提供了透明的對象存儲,因此對開發人員來說,存儲數據對象完全不需要額外的代碼(如JDBC API的使用)。這些繁瑣的例行工作已經轉移到JDO產品提供商身上,使開發人員解脫出來,從而集中時間和精力在業務邏輯上。另外,JDO很靈活,因為它可以在任何數據底層上運行。JDBC只是面向關系數據庫(RDBMS鳭DO更通用,提供到任何數據底層的存儲功能,比如關系數據庫、文件、xml以及對象數據庫(ODBMS)等等,使得應用可移植性更強。
  
  
  
  
  
  概述
  
  
  
  
  
  
  
  描述符(Metadata)和增強器(Enhancer)
  
  
  
  
  
  在JDO中,任何需要存儲的類必須是PersistenceCapable(可存儲的),而任何用到這些類的其它類必須是PersistenceAware(存儲可知的)。看上去有點復雜,不過好消息是采用JDO的透明存儲技術,你不需要在代碼中將你的類去實現javax.jdo.PersistenceCapable接口或PersistenceAware接口。你只需要象往常一樣寫一個類即可,JDO廠商會提供一個增強器,這個增強器會改造你的類代碼(譯者注:就是.class文件,改造class中的二進制代碼并不是一件很高深的事,有很多工具可以提供給你對class文件進行改造,比如在某個方法開始和結束時輸出日志等等),根據你的描述符使之實現PersistenceCapable接口。你需要做的唯一的額外工作就是為你需要存儲的類寫一個XML格式的描述符文件。附件1顯示了一個我在后面的代碼示范中會用到的描述符文件。(附件17和本文的代碼可以在www.sys-com.com/java/sourcec.cfm下載。)
  
  
  
  描述符一般來說很短,在默認條件下寫起來一點也不難,JDO從類本身已經獲取了大量的信息。你僅在下列情況下在描述符中添加額外信息:
  
  。你需要改變JDO的默認操作方式,比如,使一個屬性不存入數據庫,即使它沒有標記為transient
  
  。有些額外的信息是JDO無法從類本身獲取的,比如:哪一個屬性你想設為數據庫中的主鍵(譯者注:只有使application identity時才有這個必要),或者某個集合類型(Collection或子接口/類)中的元素是什么類型
  
  
  
  
  
  存儲治理器(PersistenceManager)
  
  
  
  
  
  當你的類被增強后,你就可能使用PersistenceManager來存儲你的對象了。要獲取一個PersistenceManager,先要設置一些屬性,通常包括下列信息:
  
  。數據庫連接信息
  
  。JDO產品的類名
  
  。默認的一些屬性,包括連接池大小等等
  
  
  
  附件3的第23行顯示了如何設置一個Properties對象,從而獲取一個JDO的PersistenceManagerFactory(相當于JDBC連接池中的DataSource),進而獲得一個PersistenceManager對象(相當于JDBC中的Connection對象),之后,你可以用這個PersistenceManager對象來增加、更新、刪除、查詢對象(這也是我在后面將會討論的)。當你的這些操作做完后,你需要關閉主這個PersistenceManager對象,以釋放它使之能被再次使用(比如另一個線程)。
  
  
  
  附件3的代碼片斷告訴你假如使用JDO來存儲和查詢對象。利用一個PersistenceManager類型的對象pm,你可以使用pm.makePersistent()方法來將一個新的對象保存到數據庫(第68行)。一個對象僅僅在第一次出現的時候才需要保存到數據庫(譯者注:更嚴格一點,只在沒有已存儲的對象引用時才需要顯式地調用makePersistent()方法),當它已經在數據庫中存在以后,可以直接通過訪問其屬性來更新該對象的信息。所有的更新在當前的Transaction(數據庫概念:事務)被提交時全部保存到數據庫中。而假如你不希望保存主這些更改,只需要簡單地rollback當前的Transaction即可(第15到17行)。類似地,你可以調用pm.deletePersistent()刪除一個對象(第26行)。
  
  
  
  要訪問已經存儲過的對象,可以簡單地遍歷其Extent(類的所有擴展),這是一個對該類對象的邏輯上的總稱(第12到15行)。
  
  
  
  假如你希望有選擇地(而不是一古腦地)取出某個類的所有對象的一個子集,你可以創建一個Query(查詢)。要做到這一點,調用pm.newQuery()來獲得一個Query對象,并傳入參數:候選對象集合和一個過濾器。候選對象集合可以是一個Collection或者一個類的Extent。過濾器是一個JDOQL(JDO Query Language)語句。當你創建了這個Query以后,就可以執行它來獲得一個符合條件的集合(Collection,第22到26行)。JDOQL是JDO的查詢語言;它有點象SQL,但卻是依照Java的語法的。這里的例子只是一個簡單的示范;使用JDOQL,你的過濾串可以寫得很復雜。另外,假如你在過濾串中使用綁定的參數的話,你可以寫一個簡單的查詢然后執行很多次,每次給出新的參數值。關于JDOQL有很多資料可以參考,參見本文的資源列表。
  
  
  
  
  
  一個對象存儲的例子
  
  
  
  
  
  要找出JDO是否象Sun說的那么好,我會寫一些代碼,分別使用JDO和JDBC來存儲我創建的Book對象(見附件4)。這個Book對象有一個name屬性和一個Block對象。為使示例有趣一些,Book對象有一個限制:每本書由其名稱唯一確定,也就是說,你不能加入兩本同名的書。
  
  
  
  一個Block(塊)是Book的組成部分,它可以是Document、Chapter或Section。最頂層的Block是Document類型的,并且可以包括任意數量的Chaptor Blocks。每個Chaptor Block可以包括任意數量的Setion Blocks,因此這些Block中有一種嵌套的關系。在每一個Block中,我們用一個HashMap來存放任意數量的其它Block的鍵值對。
  
  
  
  附件5列出了一個我的例子中做測試用的Book。這本書包括兩章(Chaptor),第一章有一節(Section),還有第二章。非凡地,第二章有一個屬性:Color=Red。
  
  
  
  用這個圖書的例子, 我要實現以下一個存儲功能:
  
  
  
  。增加:看看我能否成功地向數據庫中添加兩本書,并且假如我用同樣的名字加入第三本書,將會產生一個名稱唯一性檢查失敗的異常
  
  。更新:看看我是否能夠更新一本書:增加一個屬性“Comment”到它的根Block中。當我提交(commit)的時候,這些更新應該被保存下來,而假如我回滾(rollback),這些更新將被丟棄。
  
  。刪除:看看能否通過Query查詢一本書然后從數據庫中將它刪除。
  
  
  
  假如沒有JDO, 我通常會這樣設計:先設計幾個相關的關系數據表來存儲書中的數據,然后使用SQL和JDBC來存儲/讀取這些表。由于長度的關系,我不會在這里列出我的JDBC實現,不過假如感愛好,你可以從JDJ 網站上下載。注重,為了通過JDBC/SQL實現以上這些功能,我必須寫很長一段代碼(480行!)。我現在要做的是讓你看看用JDO來實現同樣的功能會有多么的簡單。
  
  
  
  
  
  用JDO存儲一個Book對象
  
  
  
  
  
  用JDO來存儲一個Book對象時,盡管我使用與JDBC方式中同樣的Book主鍵類,但Block的ID屬性已經完全沒有必要。在JDBC方式中,必須用ID屬性來在內部引用數據表中的不同的Block。但在JDO中,我根本不需要這個屬性,因為JDO會自動地在底層處理它。
  
  
  
  為了標明Book對象是需要存儲的,我寫了一個描述符來標記Book和Block類(見附件1)。在描述符中,我為Block類的children集合屬性標明其元素類型是Block(第10到11行),而HashMap的鍵和值的類型都是String(第12到14行)。此外,由于ID屬性并不是Block真正需要的,我在描述符中標明它不需要存儲(第8行)。在Book的描述符片斷中,我標明nm(名稱)屬性是它的主鍵(第5行),因此Book類需要使用自定義的標識類型(Application Identity),類名是BookKey(第4行)。BookKey類的代碼見附件6。
  
  
  
  在本例中,我使用的JDO產品是KodoJDO(采用關系數據庫作底層)。市場上有很多JDO的產品(Implementation);你可以選擇其中任意一種,而你的代碼不需要作任何變化。底層的關系數據庫我選擇Enhyda InstantDB(一個Kodo產品附帶的關系數據庫)。JDO的精髓在于開發人員不需要知道某個JDO產品是如何將數據存入數據庫的,所以我也不需要設計任何數據表,盡管我們底層使用的是關系數據庫。Kodo提供了一個名為schematool的工具,根據我的描述符自動地創建需要的數據表結構。我所需要做的全部事情就是運行下面的命令來預備數據庫底層(譯者注:實際上,KodoJDO2.4.0以上版本就可以完成自動的數據庫同步,這一步都可以省略。不過只建議在開發時使用):
  
  schematool action refresh Book
  
  schematool action refresh Block

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 海安县| 巫溪县| 武功县| 蒲城县| 柞水县| 钟山县| 龙南县| 同德县| 蕉岭县| 景德镇市| 桃园县| 巫溪县| 固始县| 永州市| 江安县| 宁国市| 类乌齐县| 白河县| 治多县| 涟源市| 辽源市| 湘潭市| 林芝县| 文化| 平舆县| 沁源县| 茶陵县| 淳化县| 元阳县| 犍为县| 拜城县| 岚皋县| 腾冲县| 简阳市| 桂阳县| 舟曲县| 郑州市| 郴州市| 琼中| 黑河市| 淄博市|