天天看點

《深入實踐Spring Boot》一第2章 在Spring Boot中使用資料庫2.1 使用MySQL

本節書摘來自華章出版社《深入實踐spring boot》一書中的第2章,第2.1節,作者陳韶健,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

使用資料庫是開發基本應用的基礎。借助于開發架構,我們已經不用編寫原始的通路資料庫的代碼,也不用調用jdbc(java data base connectivity)或者連接配接池等諸如此類的被稱作底層的代碼,我們将在進階的層次上通路資料庫。而spring boot更是突破了以前所有開發架構通路資料庫的方法,在前所未有的更加進階的層次上通路資料庫。因為spring boot包含一個功能強大的資源庫,為使用spring boot的開發者提供了更加簡便的接口進行通路。

本章将介紹怎樣使用傳統的關系型資料庫,以及近期一段時間異軍突起的nosql(not only sql)資料庫。

本章的執行個體工程使用了分子產品的方式建構,各子產品的定義如表2-1所示。

表2-1 執行個體工程子產品定義

項  目 工  程 功  能

對于傳統關系型資料庫來說,spring boot使用jpa(java persistence api)資源庫來實作對資料庫的操作,使用mysql也是如此。簡單地說,jpa就是為pojo(plain ordinary java object)提供持久化的标準規範,即将java的普通對象通過對象關系映射(object-relational mapping,orm)持久化到資料庫中。

為了使用jpa和mysql,首先在工程中引入它們的maven依賴,如代碼清單2-1所示。其中,指定了在運作時調用mysql的依賴。

代碼清單2-1 jpa和mysql依賴配置

首先建立一些普通對象,用來與資料庫的表建立映射關系,接着示範如何使用jpa對資料庫進行增删查改等存取操作。

假如現在有三個實體:部門、使用者和角色,并且它們具有一定的關系,即一個使用者隻能隸屬于一個部門,一個使用者可以擁有多個角色。它們的關系模型如圖2-1所示。

《深入實踐Spring Boot》一第2章 在Spring Boot中使用資料庫2.1 使用MySQL

spring boot的實體模組化與使用spring架構時的定義方法一樣,同樣比較友善的是使用了注解的方式來實作。

部門實體的模組化如代碼清單2-2所示,其中注解@table指定關聯的資料庫的表名,注解@id定義一條記錄的唯一辨別,并結合注解@generatedvalue将其設定為自動生成。部門實體隻有兩個字段:id和name。程式中省略了g

e

tter和setter方法的定義,這些方法可以使用idea的自動生成工具很友善地生成。

代碼清單2-2 部門實體模組化

@table(name = "user")

public class user implements java.io.serializable{

角色實體模組化比較簡單,隻要按設計的要求,定義id和name字段即可,當然同樣必須保證id的唯一性并将其設定為自動生成。角色實體的模組化如代碼清單2-4所示。

代碼清單2-4 角色實體模組化

@entity

@table(name = "role")

public class role implements java.io.serializable{

s save(s var1);

t findone(id var1);

long count();

void delete(id var1);

void delete(t var1);

void deleteall();

page findall(pageable var1);

list findall();

list findall(sort var1);

list findall(iterable var1);

void deleteallinbatch();

t getone(id var1);

lessthan,例如f?indbycreatedatelessthan(date start);

greaterthan,例如f?indbycreatedategreaterthan(date start);

isnull,例如f?indbynameisnull();

isnotnull,例如f?indbynameisnotnull();

notnull,與isnotnull等價;

like,例如f?indbynamelike(string name);

notlike,例如f?indbynamenotlike(string name);

orderby,例如f?indbynameorderbyidasc(string name);

not,例如f?indbynamenot(string name);

in,例如f?indbynamein(collectionnamelist);

notin,例如f?indbynamenotin(collectionnamelist)。

又如下列對使用者實體類自定義的方法聲明,它們都是符合jpa規則的,這些方法也不用實作,jpa将會代理實作這些方法。

user findbynamelike(string name);

user readbyname(string name);

list getbycreatedatelessthan(date star);

@order(ordered.highest_precedence)

@configuration

@enabletransactionmanagement(proxytargetclass = true)

@enablejparepositories(basepackages = "dbdemo.**.repository")

@entityscan(basepackages = "dbdemo.**.entity")

public class jpaconfiguration {

}<code>`</code>`javascript

javascript

其次,在mysql資料庫伺服器中建立一個資料庫test,然後配置一個可以通路這個資料庫的使用者及其密碼。資料庫的表結構可以不用建立,在程式運作時将會按照實體的定義自動建立。如果還沒有建立一個具有完全權限通路資料庫test的使用者,可以在連接配接mysql伺服器的查詢視窗中執行下面指令,這個指令假設你将在本地中通路資料庫。

grant all privileges on test.* to 'root'@'localhost' identified by '12345678';

然後,在spring boot的配置檔案application.yml中使用如代碼清單2-7所示的配置,用來設定資料源和jpa的工作模式。

代碼清單2-7 資料源和jpa配置

配置中将ddl-atuo設定為update,就是使用hibernate來自動更新表結構的,即如果資料表不存在則建立,或者如果修改了表結構,在程式啟動時則執行表結構的同步更新。

最後,編寫一個測試程式,如代碼清單2-8所示。測試程式首先初始化資料庫,建立一個部門,命名為“開發部”,建立一個角色,命名為admin,建立一個使用者,命名為user,同時将它的所屬部門設定為上面建立的部門,并将現有的所有角色都配置設定給這個使用者。然後使用分頁的方式查詢所有使用者的清單,并從查到的使用者清單中,列印出使用者的名稱、部門的名稱和第一個角色的名稱等資訊。

代碼清單2-8 mysql測試程式

"id"));

name:{}",

get(0).getname());

}