亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

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

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

  JDO應用介紹
  
  by Teresa Lau
  
  譯自:http://www.sys-con.com/java/articlePRint.cfm?id=1899
  
  
  
 ?。ㄗg者注)本文以一個實際的具有一定相互關系的類結構實例和KodoJDO產品作基礎,介紹JDO的原理、使用及特點。尤其是與傳統JDBC技術的對比,比如一個類的代碼從480行減少到140行的現實,說明JDO對代碼的減少。另外,本文作者是一位具有五年以上Java顧問經驗的女中豪杰,擁有碩士學位,目前工作于紐約。
  
  
  
  Java Data Object(JDO) 是一個用于存取某種數據倉庫中的對象的標準化API。
  
  
  
  使JDO從各種數據對象存取技術中異軍突起的是它的高度的易用性和靈活性。
  
  
  
  JDO提供了透明的對象存儲,因此對開發人員來說,存儲數據對象完全不需要額外的代碼(如JDBC API的使用)。這些繁瑣的例行工作已經轉移到JDO產品提供商身上,使開發人員解脫出來,從而集中時間和精力在業務邏輯上。另外,JDO很靈活,因為它可以在任何數據底層上運行。JDBC只是面向關系數據庫(RDBMS?,而JDO更通用,提供到任何數據底層的存儲功能,比如關系數據庫、文件、xml以及對象數據庫(ODBMS)等等,使得應用可移植性更強。
  
  
  
  
  
  概述
  
  
  
  
  
  
  
  描述符(Metadata)和增強器(Enhancer)
  
  
  
  
  
  在JDO中,任何需要存儲的類必須是PersistenceCapable(可存儲的),而任何用到這些類的其它類必須是PersistenceAware(存儲可知的)??瓷先ビ悬c復雜,不過好消息是采用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行?。N椰F在要做的是讓你看看用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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
www国产精品com| 欧美成人免费va影院高清| 久久在线视频在线| 国产成人精品电影久久久| 18一19gay欧美视频网站| 国产精品69av| 久久99精品久久久久久噜噜| 欧美日韩国产色视频| 黑丝美女久久久| 午夜精品在线观看| 久久九九热免费视频| 色综合视频一区中文字幕| 亚洲精品理论电影| 亚洲人成在线免费观看| 国产精品91久久久| 亚洲a中文字幕| 最好看的2019的中文字幕视频| 精品日韩视频在线观看| 欧美第一淫aaasss性| 91九色综合久久| 亚洲色图av在线| 国产精品丝袜高跟| 亚洲第一视频在线观看| 久久久之久亚州精品露出| 5252色成人免费视频| 国产欧美精品一区二区| 久久久久久久久国产精品| 亚州精品天堂中文字幕| 国产欧美精品在线播放| 亚洲美女精品成人在线视频| 中文字幕亚洲综合| 久久久中精品2020中文| 国产精品∨欧美精品v日韩精品| 精品在线欧美视频| 久久久99久久精品女同性| 久久久久久国产免费| 国产精品永久在线| 91精品免费视频| 色一区av在线| 久久黄色av网站| 国语自产精品视频在线看抢先版图片| 黑人狂躁日本妞一区二区三区| 国产视频精品自拍| 97久久精品在线| 日韩性生活视频| 亚洲成年网站在线观看| 日韩欧美a级成人黄色| 日本欧美爱爱爱| 日韩中文字幕免费视频| 97精品久久久中文字幕免费| 国产精品丝袜白浆摸在线| 日韩视频免费看| 国产主播喷水一区二区| 草民午夜欧美限制a级福利片| 91亚洲精品久久久久久久久久久久| 亚洲久久久久久久久久| 欧美电影免费观看高清完整| 亚洲欧美日韩一区二区三区在线| 九九精品在线播放| 亚洲国产成人爱av在线播放| 日韩av片免费在线观看| 欧美黄网免费在线观看| 久久精品国产99国产精品澳门| 国产精品丝袜一区二区三区| 午夜精品久久久久久久99热浪潮| 成人在线中文字幕| 国产精品自拍偷拍| 久久精品91久久香蕉加勒比| 欧美在线一级视频| 亚洲国产精品va| 国产精品流白浆视频| 日韩男女性生活视频| 亚洲美女又黄又爽在线观看| 国产精品欧美激情在线播放| 91av视频在线播放| 日韩久久免费电影| 91精品视频网站| 亚洲一区av在线播放| 国产精品一区二区三区免费视频| 亚洲视频第一页| 日韩欧美综合在线视频| 狠狠操狠狠色综合网| 91系列在线播放| 一个人看的www久久| 国产美女精品免费电影| 欧美色videos| 久99九色视频在线观看| 精品视频在线导航| 国产精品久久一区| 这里只有精品视频| 日韩av资源在线播放| 91大神福利视频在线| 久久综合久久88| 亚洲免费一在线| 美女精品久久久| 日本高清+成人网在线观看| 亚洲第一区第一页| 国产美女搞久久| 久久久久久亚洲精品不卡| 国产精品亚洲视频在线观看| 日韩在线播放一区| 4p变态网欧美系列| 欧美成人手机在线| 亚洲精品久久久久久久久久久久| 成人精品视频久久久久| 久久精品国产91精品亚洲| 国产精品久久91| 欧美成人小视频| 国产精品久久色| 亚洲tv在线观看| 欧美韩国理论所午夜片917电影| 日韩美女视频免费在线观看| 国产欧美在线看| 一区二区日韩精品| 亚洲a级在线播放观看| 国产98色在线| 91成人在线视频| 欧美性黄网官网| 国产美女高潮久久白浆| 青草青草久热精品视频在线观看| 日韩在线中文字| 国产一区二区三区中文| 亚洲免费人成在线视频观看| 久久久久久久久国产精品| 国产999在线| 91久久国产精品91久久性色| 亚洲人成在线免费观看| 成人啪啪免费看| 亚洲一区二区三区视频| 日韩欧美成人精品| 成人天堂噜噜噜| 国产精品久久久久久久久免费看| 亚洲国产欧美日韩精品| 国产日韩视频在线观看| 狠狠做深爱婷婷久久综合一区| 欧美日韩国产专区| 国产成人久久久精品一区| 国产一区二区三区欧美| 欧美黑人视频一区| 亚洲天堂2020| 成人欧美在线观看| 久久在精品线影院精品国产| 亚洲美女免费精品视频在线观看| 国产精品美女主播| 欧美成人免费在线观看| 美女精品视频一区| 91精品国产综合久久香蕉最新版| 欧美香蕉大胸在线视频观看| 成人久久久久久| 欧美福利视频网站| 久久综合久久88| 97免费视频在线播放| 91av视频在线观看| 亚洲精品美女久久| 国产主播精品在线| 色播久久人人爽人人爽人人片视av| 中文字幕在线成人| 亚洲天堂男人天堂| 欧美激情xxxxx| 清纯唯美日韩制服另类| 狠狠躁天天躁日日躁欧美| 精品久久中文字幕久久av| 亚洲欧洲免费视频| 日韩av在线免费看|