使用 MySQL:MySQL依賴配置+實體建模+實體持久化+MySQL 測試

使用數據庫是開發基本應用的基礎。借助于開發框架,我們已經不用編寫原始的訪 問數據庫的代碼,也不用調用JDBC (Java Data Base Connectivity)或者連接池等諸如此 類的被稱作底層的代碼,我們將在高級的層次上訪問數據庫。而Spring Boot更是突破 了以前所有開發框架訪問數據庫的方法,在前所未有的更加高級的層次上訪問數據庫。 因為Spring Boot包含一個功能強大的資源庫,為使用Spring Boot的開發者提供了更加 簡便的接口進行訪問。
本章將介紹怎樣使用傳統的關系型數據庫,以及近期一段時間異軍突起的NoSQL (Not Only SQL)數據庫。

本章的實例工程使用了分模塊的方式構建,各模塊的定義如表2-1所示。
image.png

2.1使用 MySQL
對于傳統關系型數據庫來說,Spring Boot使用JPA ( Java Persistence API)資源庫Ordinary Java Object)提供持久化的標準規范,即將Java的普通對象通過對象關系映射來實現對數據庫的操作,使用MySQL也是如此。簡單地說,JPA就是為POJO ( Plain(Object-Relational Mapping, ORM)持久化到數據庫中。

2.1.1MySQL依賴配置

為了使用JPA和MySQL,首先在工程中引入它們的Maven依賴,如代碼清單2-1 所示。其中,指定了在運行時調用MySQL的依賴。
image.png

2.1.2實體建模

首先創建一些普通對象,用來與數據庫的表建立映射關系,接著演示如何使用JPA 對數據庫進行增刪查改等存取操作。

假如現在有三個實體:部門、用戶和角色,并且它們具有一定的關系,即一個用戶 只能隸屬于一個部門,一個用戶可以擁有多個角色。它們的關系模型如圖2-1所示。
image.png
Spring Boot的實體建模與使用Spring框架時的定義方法一樣,同樣比較方便的是使用了注解的方式來實現。
部門實體的建模如代碼清單2-2所示,其中注解?Table指定關聯的數據庫的表名,注解@Id定義一條記錄的唯一標識,并結合注解@GeneratedValue將其設置為自動 生成。部門實體只有兩個字段:id和nameo程序中省略了 Getter和Setter方法的定義,這些方法可以使用IDEA的自動生成工具很方便地生成。
image.png
用戶實體包含三個字段:id、name和createdate,用戶實體建模如代碼清單2-3所 示。其中注解@ManyToOne定義它與部門的多對一關系,并且在數據庫表中用字段did 來表示部門的ID,注解@ManyToMany定義與角色實體的多對多關系,并且用中間表 user_role來存儲它們各自的ID,以表示它們的對應關系。日期類型的數據必須使用注 解@DateTimeFormat來進行格式化,以保證它在存取時能提供正確的格式,避免保存 失敗。注解@JsonBackReference用來防止關系對象的遞歸訪問。
image.png
角色實體建模比較簡單,只要按設計的要求,定義id和name字段即可,當然同樣必須保證id的唯一性并將其設定為自動生成。角色實體的建模如代碼清單2-4所示。
image.png

2.1.3實體持久化
通過上面三個實體的定義,實現了使用Java的普通對象(POJO)與數據庫表建立映射關系(ORM),接下來使用JPA來實現持久化。用戶實體使用JPA進行持久化的例子如代碼清單2.5所示。它是一個接口,并繼承于JPA資源庫JpaRepository接口 ,使用注解?Repository將這個接口也定義為一個資 源庫,使它能被其他程序引用,并為其他程序提供存取數據庫的功能。
使用相同的方法,可以定義部門實體和角色實體的資源庫接口。接口同樣繼承于 JpaRepository接口,只要注意使用的參數是各自的實體對象即可。


image.png

這樣就實現存取數據庫的功能了。現在可以對數據庫進行增刪查改、進行分頁查詢 和指定排序的字段等操作。

或許你還有疑問,我們定義的實體資源庫接口并沒有聲 明一個方法,也沒有對接口有任何實現的代碼,甚至連一條 SQL查詢語句都沒有寫,這怎么可能?
是的,使用JPA就是可以這么簡單。我們來看看JpaRe?pository 的繼承關系,你也許會明白一些。如圖2-2所示, JpaRepository 繼承于 PagingAndSortingRepository,它提供 了 分頁和排序功能,PagingAndSortingRepository 繼承于 Crud- Repository,它提供了簡單的增刪查改功能。

因為定義的接口繼承于JpaRepository,所以它傳遞性地繼承上面所有這些接口,并 擁有這些接口的所有方法,這樣就不難理解為何它包含那么多功能了。這些接口提供的 一些方法如下:


image.png
image.png

JPA還提供了一些自定義聲明方法的規則,例如,在接口中使用關鍵字findBy、 readBy. getBy作為方法名的前綴,拼接實體類中的屬性字段(首個字母大寫),并可選 擇拼接一些SQL查詢關鍵字來組合成一個查詢方法。例如,對于用戶實體,下列查詢 關鍵字可以這樣使用:
image.png

又如下列對用戶實體類自定義的方法聲明,它們都是符合JPA規則的,這些方法也不用實現,JPA將會代理實現這些方法。
image.png

2.1.4MySQL 測試
現在,為了驗證上面設計的正確性,我們用一個實例來測試一下。

首先,增加一個使用JPA的配置類,如代碼清單2.6所示。其中@EnableTransac- tionManagement 啟用了 JPA 的事務管理;@EnableJpaRepositories 啟用了 JPA 資源庫并 指定了上面定義的接口資源庫的位置;@EntityScan指定了定義實體的位置,它將導入 我們定義的實體。注意,在測試時使用的JPA配置類可能與這個配置略有不同,這個配 置的一些配置參數是從配置文件中讀取的,而測試時使用的配置類把一些配置參數都包 含在類定義中了。
image.png

其次,在MySQL數據庫服務器中創建一個數據庫test,然后配置一個可以訪問這 個數據庫的用戶及其密碼。數據庫的表結構可以不用創建,在程序運行時將會按照實 體的定義自動創建。如果還沒有創建一個具有完全權限訪問數據庫test的用戶,可以 在連接MySQL服務器的查詢窗口中執行下面指令,這個指令假設你將在本地中訪問數 據庫。
image.png

然后,在Spring Boot的配置文件application.yml中使用如代碼清單2-7所示的配置,用來設置數據源和JPA的工作模式。
image.png

配置中將ddl-atuo設置為叩date,就是使用Hibernate來自動更新表結構的,即如 果數據表不存在則創建,或者如果修改了表結構,在程序啟動時則執行表結構的同步 更新。
最后,編寫一個測試程序,如代碼清單2.8所示。測試程序首先初始化數據庫,創
建一個部門,命名為“開發部”,創建一個角色,命名為admin,創建一個用戶,命名 為user,同時將它的所屬部門設定為上面創建的部門,并將現有的所有角色都分配給這 個用戶。然后使用分頁的方式查詢所有用戶的列表,并從查到的用戶列表中,打印岀用 戶的名稱、部門的名稱和第一個角色的名稱等信息。
image.png

好了,現在可以使用JUnit來運行這個測試程序了,在IDEA的Run/Debug Configuration配置中增加一個JUint配置項,模塊選擇mysql,工作目錄選擇模塊所在 的根目錄,程序選擇dbdemo.mysql.test.MysqlTest,并將配置項目名稱保存為mysqltest, 如圖2-3所示。

用Debug方式運行測試配置項目mysqltest,可以在控制臺中看到執行的過程和結 果。如果狀態欄中顯示為綠色,并且提示“ All Tests passed”,則表示測試全部通過。 在控制臺中也可以查到下列打印信息:
image.png

這時如果在MySQL服務器中查看數據庫test,不但可以看到表結構都已經創建了, 還可以看到上面測試生成的一些數據。
這是不是很激動人心?在Spring Boot使用數據庫,就是可以如此簡單和有趣。到 目前為止,我們不僅沒有寫過一條查詢語句,也沒有實現一個訪問數據庫的方法,但是 已經能對數據庫執行所有的操作,包括一般的增刪查改和分頁查詢。
image.png
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容