為什么80%的碼農都做不了架構師?>>>
db4o 所有最新的版本都可以直接在官方網站上下載,進入 db4o 的下載頁面,我們可以看到最新的 for Java 穩定版本,包括 JAR、源代碼、入門文檔、API 等內容的完整的打包文件只有 6 MB,db4o 還有一個對象數據庫管理工具 ObjectManager,目前版本是 1.8。
接著在 Eclipse 中新建 Java 項目,把 db4o 對象數據庫引擎包 db4o-8.0.249.16098-all-java5.jar 導入進項目。由于 db4o 支持多種版本的 JDK,除了 for JDK 5.0 的 db4o-8.0.249.16098-all-java5.jar 外,還有 for JDK 1.1、1.2-1.4 的 JAR 包,以適應多種環境。與 Hibernate、iBATIS SQL Maps 相比,db4o 更加自然,無需過多地引用第三方支持庫。
db4o 怎樣進行對象持久化呢?通過瀏覽目錄可以發現,與傳統的 RDBMS 一樣,db4o 也有自己的數據庫文件, 在 db4o 中數據庫文件的后綴名是“*.yap”。讓我們先來了解一下 db4o 對象數據庫引擎的主要包結構:
com.db4o
com.db4o 包含了使用 db4o 時最經常用到的功能。兩個最重要的接口是 com.db4o.Db4o 和 com.db4o.ObjectContainer。com.db4o.Db4o 工廠是運行 db4o 的起點,這個類中的靜態方法可以開啟數據庫文件、啟動服務器或連接一個已經存在的服務器,還可以在開啟數據庫之前進行 db4o 環境配置。com.db4o.ObjectContainer 接口很重要,開發過程中 99% 的時間都會用到它,ObjectContainer 可在單用戶模式下作為數據庫實例,也可作為 db4o 服務器的客戶端。每個 ObjectContainer 實例都有自己的事務。所有的操作都有事務保證。當打開 ObjectContainer,就已經進入事務了,commit() 或 rollback() 時,下一個事務立即啟動。每個 ObjectContainer 實例維護它自己所管理的已存儲和已實例化對象,在需要 ObjectContainer 的時候,它會一直保持開啟狀態,一旦關閉,內存中數據庫所引用的對象將被丟棄。
com.db4o.ext
你也許想知道為什么在 ObjectContainer 中只能看見很少的方法,原因如下:db4o 接口提供了兩個途徑,分別在 com.db4o 和 com.db4o.ext 包中。這樣做首先是為了讓開發者能快速上手;其次為了讓其他產品能更容易的復制基本的 db4o 接口;開發者從這一點上也能看出 db4o 是相當輕量級的。每個 com.db4o.ObjectContainer 對象也是 com.db4o.ext.ExtObjectContainer 對象??梢赞D換成 ExtObjectContainer 獲得更多高級特性。
com.db4o.config
com.db4o.config 包含了所有配置 db4o 所需的類。
com.db4o.query
com.db4o.query 包包含了構造“原生查詢, NQ(Native Queries)”所需的 Predicate 類。NQ 是 db4o 最主要的查詢接口。
db4o 提供兩種運行模式,分別是本地模式和服務器模式。本地模式是指直接在程序里打開 db4o 數據庫文件進行操作:
Db4oEmbedded.openFile(Db4oEmbedded.newConfiguration(),"auto.yap");
而服務器模式則是客戶端通過 IP 地址、端口以及授權口令來訪問服務器:
服務器端:
ObjectServerserver=Db4oClientServer.openServer("auto.yap",1212); server.grantAccess("admin","1");
客戶端:
//ip為服務器的ip地址 Db4oClientServer.openClient(ip,1212,"admin","1");
需要注意的是db4o會自動創建數據庫文件,但是并不會創建數據庫文件目錄,比如我想創建數據庫文件”/export/db4o/auto.yap”,db4o并不會自動創建”/export/db4o”目錄 ,所以創建數據庫文件時最好初始化下數據庫目錄:
privatevoidinitDBFile(StringdbName){ Filefile=newFile(dbName); if(file.exists()){ return; } List<File>fList=newArrayList<File>(); FilepFile=file.getParentFile(); while(!pFile.exists()){ fList.add(pFile); pFile=pFile.getParentFile(); } for(inti=fList.size()-1;i>=0;i--){ Filef=fList.get(i); f.mkdir(); } }
上面介紹的兩種方式都可以得到 ObjectContainer 實例,就目前Java EE的分布式的應用環境來看,服務器模式更有現實意義;而本地模式更適合于單服務器應用。因為分布式模式比較常用,本文在下面的例子都將采用分布式模式。
在下面的例子中,會使用一個UserVO對象,然后介紹db4o對該對象的CRUD。
UserVO對象
publicclassUserVOimplementsSerializable{ privatestaticfinallongserialversionuid=-9129148024922569814L; privateStringuserName; privateStringpassword; publicUserVO(){} publicUserVO(StringuserName,Stringpassword){ this.userName=userName; this.password=password; } publicStringgetPassword(){ returnpassword; } publicvoidsetPassword(Stringpassword){ this.password=password; } publicStringgetUserName(){ returnuserName; } publicvoidsetUserName(StringuserName){ this.userName=userName; } @Override publicbooleanequals(Objectobj){ if(this==obj){ returntrue; } if(!(objinstanceofUserVO)){ returnfalse; } UserVOother=(UserVO)obj; if(!(userName==null?other.userName==null:userName.equals(other.userName))){ returnfalse; } if(!(password==null?other.password==null:password.equals(other.password))){ returnfalse; } returntrue; } @Override publicinthashCode(){ finalintprime=31; intresult=17; result=prime*result+((userName==null)?0:userName.hashCode()); result=prime*result+((password==null)?0:password.hashCode()); returnresult; } @Override publicStringtoString(){ return"UserVO[userName="+userName+",password="+password+"]"; } }
publicstaticvoidmain(String[]args){ UserVOvo=newUserVO("admin","1"); //打開數據庫,ip為服務器ip ObjectContainerdb=Db4oClientServer.openClient(ip,1212,"admin","1"); try{ //存儲數據 db.store(vo); //提交事務 db.commit(); }catch(Exceptione){ //出現異常則回滾 db.rollback(); }finally{ //關閉連接 db.close(); } }
publicstaticvoidmain(String[]args){ //打開數據庫 ObjectContainerdb=Db4oClientServer.openClient(ip,1212,"admin","1"); try{ //構造查詢對象 Queryquery=db.query(); //設置被約束實例 query.constrain(UserVO.class); //設置被約束實例的字段和約束條件 query.descend("userName").constrain("admin"); //查詢對象 ObjectSet<UserVO>list=query.execute(); //dosomethingwithlist }finally{ //關閉連接 db.close(); } }
publicstaticvoidmain(String[]args){ //打開數據庫 ObjectContainerdb=Db4oClientServer.openClient(ip,1212,"admin","1"); try{ ObjectSet<UserVO>result=db.query(newPredicate<UserVO>(){ privatestaticfinallongserialVersionUID=1554763863522546547L; publicbooleanmatch(UserVOvo){ //匹配userName為admin的UserVO returnvo.getUserName().equals("admin"); } }); if(result.size()!=1){ thrownewRuntimeException("sizedoesnotmatched."); } UserVOvo=result.next(); //修改passport vo.setPassword("0"); db.store(vo); db.commit(); }catch(Exceptione){ db.rollback(); }finally{ //關閉連接 db.close(); } }
publicstaticvoidmain(String[]args){ UserVOvo=newUserVO("admin","1"); //打開數據庫 ObjectContainerdb=Db4oClientServer.openClient(ip,1212,"admin","1"); try{ ObjectSet<UserVO>result=db.query(newPredicate<UserVO>(){ privatestaticfinallongserialVersionUID=-4397123083792023957L; publicbooleanmatch(UserVOvo){ //匹配userName為admin的UserVO returnvo.getUserName().equals("admin"); } }); if(result.size()!=1){ thrownewRuntimeException("sizedoesnotmatched."); } UserVOvo=result.next(); db.delete(vo); db.commit(); }catch(Exceptione){ db.rollback(); }finally{ //關閉連接 db.close(); } }
通過本系列文章,db4o 的優勢已經體現得淋漓盡致,它的添加、更新、刪除是如此的簡單,正如 db4o 的口號那樣——“僅需一行代碼就能存儲復雜結構對象,極大的降低了開發時間和成本,提供高效的性能,無需 DBA 干預”。
如本文有不詳盡之處,大家可以參考官方的《用戶指南》,db4o 中文社區正在火熱成長!
學習
db4o官方網站。
面向對象數據庫 db4o 之旅系列:查看此系列文章完整列表。
ODMG 官方網站:了解 ODMG 技術。
獲得產品和技術
下載 db4o 免費版。
轉載于:https://my.oschina.net/xionghui/blog/489727
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...
在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...
在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...
如何測試micro sd卡速度?要測試sd卡的速度,可以使用MyDiskTest軟件,不僅可以檢測存儲卡的真偽,還可以檢測存儲卡的讀寫速度。MyDiskTest是一款u盤擴展檢測工具,具有擴展檢測、壞塊掃描、速度測試、老化測試、壞塊屏蔽五大功能。也是識別u盤、SD卡、CF卡等移動存儲產品擴容的工具,可以輕松檢測存儲產品是否擴容、以次充好。怎么看U盤是否是正版?使用MyDiskTwin10怎么查看U...
天津梅江屬于哪個區 天津梅江屬于哪個區?天津梅江會展中心在哪? 天津梅江屬于天津市河西區!位于天津市南部,河西區、津南區、西青區交匯處。地理位置優越:距市中心區6公里,高教區8公里,濱海國際機場21公里,津滬高速公路交叉口14公里,津京塘高速公路交叉口23公里。所有這些都使梅江成為一個具有巨大升值潛力的地區。 天津梅江會展中心在哪里? 天津梅江會展中心屬于天津西青區。梅江會展中心位于西青區...
綏化市是黑龍江省的一個地級市,隸屬于黑龍江省管轄。綏化位于黑龍江省中部,松嫩平原呼蘭河流域。是黑龍江省重要的交通樞紐,省內六大客貨運中轉站之一,哈爾濱北部重要的區域性中心城市,東與森林之都伊春,省會哈爾濱,西與大慶,北與黑河,西北與鶴城齊齊哈爾。綏化市是一個地級市,轄一區三市六縣。綏化是黑龍江省的一個地級市,轄1區3縣級市6縣。綏化主城區人口約48萬。綏化市是黑龍江省的一個地級市,隸屬于黑龍江省。...