使用數據庫是開發基本應用的基礎。借助于開發框架,我們已經不用編寫原始的訪 問數據庫的代碼,也不用調用JDBC (Java Data Base Connectivity)或者連接池等諸如此 類的被稱作底層的代碼,我們將在高級的層次上訪問數據庫。而Spring Boot更是突破 了以前所有開發框架訪問數據庫的方法,在前所未有的更加高級的層次上訪問數據庫。 因為Spring Boot包含一個功能強大的資源庫,為使用Spring Boot的開發者提供了更加 簡便的接口進行訪問。
本章將介紹怎樣使用傳統的關系型數據庫,以及近期一段時間異軍突起的NoSQL (Not Only SQL)數據庫。
2.1使用 MySQL
對于傳統關系型數據庫來說,Spring Boot使用JPA ( Java Persistence API)資源庫Ordinary Java Object)提供持久化的標準規范,即將Java的普通對象通過對象關系映射來實現對數據庫的操作,使用MySQL也是如此。簡單地說,JPA就是為POJO ( Plain(Object-Relational Mapping, ORM)持久化到數據庫中。
2.1.1MySQL依賴配置
2.1.2實體建模
首先創建一些普通對象,用來與數據庫的表建立映射關系,接著演示如何使用JPA 對數據庫進行增刪查改等存取操作。
部門實體的建模如代碼清單2-2所示,其中注解?Table指定關聯的數據庫的表名,注解@Id定義一條記錄的唯一標識,并結合注解@GeneratedValue將其設置為自動 生成。部門實體只有兩個字段:id和nameo程序中省略了 Getter和Setter方法的定義,這些方法可以使用IDEA的自動生成工具很方便地生成。
2.1.3實體持久化
通過上面三個實體的定義,實現了使用Java的普通對象(POJO)與數據庫表建立映射關系(ORM),接下來使用JPA來實現持久化。用戶實體使用JPA進行持久化的例子如代碼清單2.5所示。它是一個接口,并繼承于JPA資源庫JpaRepository接口 ,使用注解?Repository將這個接口也定義為一個資 源庫,使它能被其他程序引用,并為其他程序提供存取數據庫的功能。
使用相同的方法,可以定義部門實體和角色實體的資源庫接口。接口同樣繼承于 JpaRepository接口,只要注意使用的參數是各自的實體對象即可。
這樣就實現存取數據庫的功能了。現在可以對數據庫進行增刪查改、進行分頁查詢 和指定排序的字段等操作。
或許你還有疑問,我們定義的實體資源庫接口并沒有聲 明一個方法,也沒有對接口有任何實現的代碼,甚至連一條 SQL查詢語句都沒有寫,這怎么可能?
是的,使用JPA就是可以這么簡單。我們來看看JpaRe?pository 的繼承關系,你也許會明白一些。如圖2-2所示, JpaRepository 繼承于 PagingAndSortingRepository,它提供 了 分頁和排序功能,PagingAndSortingRepository 繼承于 Crud- Repository,它提供了簡單的增刪查改功能。
因為定義的接口繼承于JpaRepository,所以它傳遞性地繼承上面所有這些接口,并 擁有這些接口的所有方法,這樣就不難理解為何它包含那么多功能了。這些接口提供的 一些方法如下:
又如下列對用戶實體類自定義的方法聲明,它們都是符合JPA規則的,這些方法也不用實現,JPA將會代理實現這些方法。
2.1.4MySQL 測試
現在,為了驗證上面設計的正確性,我們用一個實例來測試一下。
首先,增加一個使用JPA的配置類,如代碼清單2.6所示。其中@EnableTransac- tionManagement 啟用了 JPA 的事務管理;@EnableJpaRepositories 啟用了 JPA 資源庫并 指定了上面定義的接口資源庫的位置;@EntityScan指定了定義實體的位置,它將導入 我們定義的實體。注意,在測試時使用的JPA配置類可能與這個配置略有不同,這個配 置的一些配置參數是從配置文件中讀取的,而測試時使用的配置類把一些配置參數都包 含在類定義中了。
其次,在MySQL數據庫服務器中創建一個數據庫test,然后配置一個可以訪問這 個數據庫的用戶及其密碼。數據庫的表結構可以不用創建,在程序運行時將會按照實 體的定義自動創建。如果還沒有創建一個具有完全權限訪問數據庫test的用戶,可以 在連接MySQL服務器的查詢窗口中執行下面指令,這個指令假設你將在本地中訪問數 據庫。
然后,在Spring Boot的配置文件application.yml中使用如代碼清單2-7所示的配置,用來設置數據源和JPA的工作模式。
配置中將ddl-atuo設置為叩date,就是使用Hibernate來自動更新表結構的,即如 果數據表不存在則創建,或者如果修改了表結構,在程序啟動時則執行表結構的同步 更新。
最后,編寫一個測試程序,如代碼清單2.8所示。測試程序首先初始化數據庫,創
建一個部門,命名為“開發部”,創建一個角色,命名為admin,創建一個用戶,命名 為user,同時將它的所屬部門設定為上面創建的部門,并將現有的所有角色都分配給這 個用戶。然后使用分頁的方式查詢所有用戶的列表,并從查到的用戶列表中,打印岀用 戶的名稱、部門的名稱和第一個角色的名稱等信息。
好了,現在可以使用JUnit來運行這個測試程序了,在IDEA的Run/Debug Configuration配置中增加一個JUint配置項,模塊選擇mysql,工作目錄選擇模塊所在 的根目錄,程序選擇dbdemo.mysql.test.MysqlTest,并將配置項目名稱保存為mysqltest, 如圖2-3所示。
這時如果在MySQL服務器中查看數據庫test,不但可以看到表結構都已經創建了, 還可以看到上面測試生成的一些數據。
這是不是很激動人心?在Spring Boot使用數據庫,就是可以如此簡單和有趣。到 目前為止,我們不僅沒有寫過一條查詢語句,也沒有實現一個訪問數據庫的方法,但是 已經能對數據庫執行所有的操作,包括一般的增刪查改和分頁查詢。