正如我在第1部分中已經提到的那樣,我已經選擇CouchDB作為我的NoSQL數據庫,選擇Ektorp庫作為數據庫驅動程序。
CouchDB –輕松數據庫。
CouchDB本質上將充當我的文檔存儲。 它本身以JSON格式 (我認為實際上是稱為BSON的二進制版本)存儲其文檔,并且不需要對文檔的結構有先驗知識。 您幾乎可以存儲任何內容,甚至可以在同一數據庫中混合使用不同類型的文檔。
由于沒有諸如DDL腳本或XSD架構之類的先前設置步驟,因此上手可能很快。 實際上,如果您可以使用CURL,則無需任何操作,只需向CouchDB發出HTTP命令即可存儲您的東西。 就像它說的那樣-CouchDB相當輕松。 有關CouchDB基礎入門的完整說明,請參閱CouchDB:權威指南 。
從Java到JSON格式。
當然,當我們使用Java時,JSON作為基于String的表示形式使用起來并不方便。 這是Ektorp介入的地方,使用Jackson Java-to-JSON庫使事情順利進行。 Jackson促進了Ektorp幕后的開箱即用POJO到JSON轉換過程。
Jackson是該項目的重要功能,因為我想實現從XML到Java對象再到數據庫文檔然后再返回的干凈,無憂的開發流程。 杰克遜是完成這項工作的關鍵組成部分,我們將在后面看到。
CouchDB的文檔存儲先決條件。
盡管CouchDB不需要模式,但每個文檔確實需要兩個基本數據:唯一ID和文檔修訂號。 這些數據項有助于管理文檔和實現冪等規則,以幫助維護多用戶環境中的文檔完整性。 CouchDB希望將這些字段命名為'_id'和'_revision' 。 _id可以在創建操作期間由用戶或數據庫分配。 _revision由數據庫分配,每次文檔記錄更新時,_revision都會遞增。
現在顯然我不希望將特定于數據庫的字段放入XML文檔中,因此我對產品的定義有一個名為“ Id”的字段和一個名為“ Revision”的字段。 除非我做任何事情,否則該文檔將無法滿足在CouchDB中存儲的必要條件,并且奇怪的事情將開始發生,例如在運行時將額外的_id和_revision字段添加到數據庫記錄中,而這些字段與Id和Revision不匹配。我要求CouchDB存儲XML文檔。 我不想為了添加這些數據庫特定字段而更改產品的XML模式,該怎么辦?
聰明地,可以將Jackson配置為糾正此問題,而無需觸碰從Product XML架構派生的“ Product”對象的Java / JaxB定義。 可以說在運行時將產品的“ Id”和“修訂”字段重新映射到CouchDb的“ _id”和“ _revision”字段。 這樣可以保持一定程度的松散耦合,但是允許我在我的代碼中使用相同的JaxB生成的Java對象,從而節省了大量的時間和精力。
訪問數據庫。
CouchDB無法通過JDBC訪問,并且沒有傳統的JDBC驅動程序。 相反,它使用REST接口(基于HTTP的GET,PUT,POST,DELETE等),并使用JSON格式的內容進行通信。
Ektorp提供了一些幫助程序類,以幫助您使用CouchDB數據庫。 有一個可實例化的Connector類可建立與數據庫的可行連接,還有一個可定制的RepositorySupport類,該類提供了用于與數據庫及其記錄進行交互的類型安全的便捷方法。
創建一個DAO。
通過擴展名和類類型正確自定義后,RepositorySupport類就可以用于您的所有基本數據訪問對象要求,例如Get,Create,Update和Remove操作。 它也可以純粹基于您添加到其中的方法的名稱自動生成CouchDB視圖(只要它們遵循某些規則)。 這樣可以輕松地向您的DAO添加“查找”方法,例如“ findByManufacturerName”或“ findByCategoryId”。 最后,如果您需要更復雜的視圖或映射/減少查詢,它也可以為您提供幫助。
全部拉在一起。
通過配置Jackson并使用Ektorp創建DAO,現在只是編寫一些集成測試以確保所有內容都可以在一起的一種情況。 我最初使用的測試非常簡單,我要求DAO進行...
- 創建一個新的JaxB產品對象并為其分配一個ID
- 將其保存到我的CouchDB“產品”數據庫中
- 使用ID從“產品”數據庫中讀取產品對象
- 修改并更新產品對象
- 再次檢索它,檢查版本是否增加
- 最后, 刪除產品對象并檢查現在嘗試讀取它的操作是否失敗
如果DAO代碼可以完成所有這些事情,那么我具有產品實體服務實現所需的基本行為。 但是,由于這是一個集成測試,因此我需要在測試周期中可用的CouchDB服務。 Maven可以通過使用Maven Failsafe插件將此類測試綁定到Maven構建生命周期的特定部分進行集成測試來幫助進行集成測試。 這樣可以避免將集成測試與通常具有較少依賴性和運行時要求的普通單元測試混在一起。
使CouchDB在本地工作非常簡單,但是如果您不必為安裝和設置過程所困擾,也可以使用免費的云托管CouchDB開發實例 。 我都嘗試過,并且它們同樣工作良好。
下一步是什么?
現在,我的CouchDB DAO已完成,是時候進入項目的最后階段了,我將把DAO行為鏈接到我先前創建的Web Service功能。 為此,我將使用Java Enterprise Edition 6。
如果您希望在下一期出版物發布時收到電子郵件通知,請單擊右側的鏈接進行訂閱。
繼續第4部分 。
參考: 使用NoSQL實施實體服務–第3部分:我們的JCG合作伙伴 Ben Wilcock的CouchDB ,位于SOA,BPM,Agile和Java博客上。
翻譯自: https://www.javacodegeeks.com/2012/09/implementing-entity-services-using_6090.html