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

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

本章的實(shí)例工程使用了分模塊的方式構(gòu)建,各模塊的定義如表2-1所示。

image

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

2.1.1MySQL依賴配置

為了使用JPA和MySQL,首先在工程中引入它們的Maven依賴,如代碼清單2-1 所示。其中,指定了在運(yùn)行時(shí)調(diào)用MySQL的依賴。

image

2.1.2實(shí)體建模

首先創(chuàng)建一些普通對象,用來與數(shù)據(jù)庫的表建立映射關(guān)系,接著演示如何使用JPA 對數(shù)據(jù)庫進(jìn)行增刪查改等存取操作。

假如現(xiàn)在有三個(gè)實(shí)體:部門、用戶和角色,并且它們具有一定的關(guān)系,即一個(gè)用戶 只能隸屬于一個(gè)部門,一個(gè)用戶可以擁有多個(gè)角色。它們的關(guān)系模型如圖2-1所示。

image

Spring Boot的實(shí)體建模與使用Spring框架時(shí)的定義方法一樣,同樣比較方便的是使用了注解的方式來實(shí)現(xiàn)。
部門實(shí)體的建模如代碼清單2-2所示,其中注解?Table指定關(guān)聯(lián)的數(shù)據(jù)庫的表名,注解@Id定義一條記錄的唯一標(biāo)識,并結(jié)合注解@GeneratedValue將其設(shè)置為自動 生成。部門實(shí)體只有兩個(gè)字段:id和nameo程序中省略了 Getter和Setter方法的定義,這些方法可以使用IDEA的自動生成工具很方便地生成。

image

用戶實(shí)體包含三個(gè)字段:id、name和createdate,用戶實(shí)體建模如代碼清單2-3所 示。其中注解@ManyToOne定義它與部門的多對一關(guān)系,并且在數(shù)據(jù)庫表中用字段did 來表示部門的ID,注解@ManyToMany定義與角色實(shí)體的多對多關(guān)系,并且用中間表 user_role來存儲它們各自的ID,以表示它們的對應(yīng)關(guān)系。日期類型的數(shù)據(jù)必須使用注 解@DateTimeFormat來進(jìn)行格式化,以保證它在存取時(shí)能提供正確的格式,避免保存 失敗。注解@JsonBackReference用來防止關(guān)系對象的遞歸訪問。

image

角色實(shí)體建模比較簡單,只要按設(shè)計(jì)的要求,定義id和name字段即可,當(dāng)然同樣必須保證id的唯一性并將其設(shè)定為自動生成。角色實(shí)體的建模如代碼清單2-4所示。

image

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

image

這樣就實(shí)現(xiàn)存取數(shù)據(jù)庫的功能了。現(xiàn)在可以對數(shù)據(jù)庫進(jìn)行增刪查改、進(jìn)行分頁查詢 和指定排序的字段等操作。

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

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

image
image

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

image

又如下列對用戶實(shí)體類自定義的方法聲明,它們都是符合JPA規(guī)則的,這些方法也不用實(shí)現(xiàn),JPA將會代理實(shí)現(xiàn)這些方法。

image

2.1.4MySQL 測試
現(xiàn)在,為了驗(yàn)證上面設(shè)計(jì)的正確性,我們用一個(gè)實(shí)例來測試一下。
首先,增加一個(gè)使用JPA的配置類,如代碼清單2.6所示。其中@EnableTransac- tionManagement 啟用了 JPA 的事務(wù)管理;@EnableJpaRepositories 啟用了 JPA 資源庫并 指定了上面定義的接口資源庫的位置;@EntityScan指定了定義實(shí)體的位置,它將導(dǎo)入 我們定義的實(shí)體。注意,在測試時(shí)使用的JPA配置類可能與這個(gè)配置略有不同,這個(gè)配 置的一些配置參數(shù)是從配置文件中讀取的,而測試時(shí)使用的配置類把一些配置參數(shù)都包 含在類定義中了。

image

其次,在MySQL數(shù)據(jù)庫服務(wù)器中創(chuàng)建一個(gè)數(shù)據(jù)庫test,然后配置一個(gè)可以訪問這 個(gè)數(shù)據(jù)庫的用戶及其密碼。數(shù)據(jù)庫的表結(jié)構(gòu)可以不用創(chuàng)建,在程序運(yùn)行時(shí)將會按照實(shí) 體的定義自動創(chuàng)建。如果還沒有創(chuàng)建一個(gè)具有完全權(quán)限訪問數(shù)據(jù)庫test的用戶,可以 在連接MySQL服務(wù)器的查詢窗口中執(zhí)行下面指令,這個(gè)指令假設(shè)你將在本地中訪問數(shù) 據(jù)庫。

image

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

image

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

image

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

用Debug方式運(yùn)行測試配置項(xiàng)目mysqltest,可以在控制臺中看到執(zhí)行的過程和結(jié) 果。如果狀態(tài)欄中顯示為綠色,并且提示“ All Tests passed”,則表示測試全部通過。 在控制臺中也可以查到下列打印信息:

image

這時(shí)如果在MySQL服務(wù)器中查看數(shù)據(jù)庫test,不但可以看到表結(jié)構(gòu)都已經(jīng)創(chuàng)建了, 還可以看到上面測試生成的一些數(shù)據(jù)。
這是不是很激動人心?在Spring Boot使用數(shù)據(jù)庫,就是可以如此簡單和有趣。到 目前為止,我們不僅沒有寫過一條查詢語句,也沒有實(shí)現(xiàn)一個(gè)訪問數(shù)據(jù)庫的方法,但是 已經(jīng)能對數(shù)據(jù)庫執(zhí)行所有的操作,包括一般的增刪查改和分頁查詢。

image
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容