閱讀600 返回首頁    go 阿裏雲 go 技術社區[雲棲]


《Spring Data實戰》——第2章 Repository:便利的數據訪問層 2.1快速入門

本節書摘來自異步社區《Spring Data實戰》一書中的第2章,第2.1節,作者: 【美】Mark Pollack , Oliver Gierke , Thomas Risberg , Jon Brisbin , Michael Hunger著,更多章節內容可以訪問雲棲社區“異步社區”公眾號查看

第2章 Repository:便利的數據訪問層

長期以來,實現應用程序的數據訪問層一直是件繁瑣的工作,因為我們經常需要編寫大量的樣板式代碼,而且貧血(anemic)的領域類並沒有按照真正麵向對象或領域驅動方式來進行設計。因此Spring Data Repository抽象的目標就是大幅簡化各種持久化存儲持久層的實現。我們將會使用Spring Data JPA模塊作為例子來討論Repository抽象的基本理念。對於其他類型的存儲,可以參考對應的例子。

2.1 快速入門

我們選取領域模型中的Customer領域類,它會被持久化到任意的存儲之中。這個類應該如示例2-1所示。

示例2-1 Customer領域類

screenshot

傳統的實現數據訪問層的方式至少需要實現一個存儲類(repository class),這個類會包含基本的CRUD(Create、Read、Update與Delete)方法以及通過限製條件來訪問實體子集的查詢方法。Spring Data Repository的方式能夠避免大多數的代碼,隻需為這個實體存儲聲明簡單的接口定義即可,如示例2-2所示。

示例2-2 CustomerRepository接口定義

screenshot

正如你所見,我們擴展了Spring Data的Repository接口,它是通用的標識接口。它的主要職責是讓Spring Data的基礎設施識別出所有用戶定義的Spring Data Repository。除此之外,它還會捕獲托管的領域類以及實體的ID類型,稍後這些功能會提供很大的便利性。為了能夠自動發現所聲明的接口,可以使用存儲特定的XML命名空間中的元素(如示例2-3所示),或是在使用JavaConfig時借助相關的@Enable...Repositories注解(如示例2-4所示)。在示例中會使用JPA。我們隻需將XML元素的base-package屬性配置為我們的根包(root package),Spring Data會掃描它來查找Repository接口。如果沒有給出更進一步的配置,那麼它隻會簡單地檢查包中帶有注解的類。

示例2-3 使用XML激活Spring Data Repository

screenshot

示例2-4 使用Java Config激活Spring Data Repository

screenshot

XML和JavaConfig配置都需要添加存儲專用的Bean聲明來進行完善,如JPA的EntityManagerFactory以及DataSource等。對於其他形式的存儲,我們隻需使用對應的命名空間元素或注解即可。例如,示例2-5所示的配置片段,將會找到Spring Data Repository並創建Spring Bean,這些Bean實際上是由一組實現了所發現接口的代理所組成的。因此,現在可以繼續編寫客戶端,通過Spring的自動裝配就能訪問這個Bean了。

CustomerRepository接口建立之後,我們就可以繼續深入學習並添加一些易於聲明的查詢方法。常見的需求是通過電子郵件地址來獲取Customer。為了做到這一點,我們添加合適的查詢方法,如示例2-6所示。

示例2-5 客戶端使用Spring Data Repository

screenshot

示例2-6 聲明查詢方法

screenshot

命名空間元素將會在容器啟動的時候掃描到這個接口並觸發Spring Data的基礎設施為其創建Spring Bean。基礎設施會探查接口中聲明的方法並確定方法調用時要執行的查詢。如果隻是這樣簡單地定義方法的話,那麼Spring Data將會根據其名字衍生出一個查詢。在定義查詢方麵還有其他的途徑可選,可以閱讀2.2小節“定義查詢方法”來了解更多信息。

在示例2-6中,由於我們遵循了領域對象屬性的命名約定,因而查詢可以衍生得到。查詢方法名中的EmailAddress部分其實就對應了Customer類的emailAddress屬性,因此,在使用JPA模塊時,Spring Data會自動為聲明的方法衍生出select C from Customer c where c.emailAddress = ?1。它還會檢查方法聲明中屬性引用的合法性,如果發現任何錯誤則會在容器啟動時,出現啟動失敗。現在,客戶端可以很容易地執行這個方法,給定的方法參數會綁定到根據方法名衍生出來的查詢之中並且執行該查詢,如示例2-7所示。

示例2-7 執行查詢方法

screenshot

最後更新:2017-05-31 12:02:31

  上一篇:go  Django 博客開發教程 6 - 真正的 Django 博客首頁視圖
  下一篇:go  Django 博客開發教程 5 - Django 博客首頁視圖