Spring 框架下透過各種 annotation 來定義各種設定,下面會介紹常用的幾種功能
@SpringBootApplication
這個 annotation 是一堆 annotation 的綜合體如果有特別理由需要放不同目錄下的話可以參考下面作法,命令其額外去掃描其他目錄
@Controller
和 @RestController
都可以用來指定 class 為 Controller,區別為是否包含 View 的回傳,單純的資料交換的話使用 @RestController
就好了
用 annotation 的好處是,只要在任意的 class 開頭定義好,Spring 啟動後就會自動去找,不需要一個一個 import 也不用為了路徑去改變專案結構
@RequestMapping
這個 annotation 決定詳細的路徑以及 header、body、method 等等訊息在內,主要的 request 設定其實都仰賴它
而 Spring 後來又推出以 method 分類的 annotation 包含:
@GetMapping
@PostMapping
@DeleteMapping
@PutMapping
@PatchMapping
上面的 @RequestMapping
就等價於 @GetMapping
,value
/path
定義了路徑,method
定義方法,也可以額外定義 header
@RequestParam
則是參數傳遞的方法,下面會一併提到
/user/{id}
=> @PathVariable("id")
/user?id=
=> @RequestParam("id")
@RequestBody
@RequestPart("name")
這邊特別講一下子路由的設定,@RequestMapping
的 annotation 比較特別,不只可以用在 method 上來設定觸發的功能,也可以宣告在 class 上用來定義子路由,例如:
這樣設定下,在 MemberController 中的路由都會從 /user
開始,藉由這種方式達到子路由的功能,而 @GetMapping
這類的 annotation 則沒有這種用法,各個方法的 mapping 都只能用在 method 的宣告上
要用到畫面之前要先引入官方推薦的模板引擎 thymeleaf
相關設定:
然後在專案結構的 resources
資料夾底下創建 templates
和 static
兩個資料夾,templates 用來放 html,static 則是放 css 與 js 等等靜態資源。
code:
然後回傳的值會去尋找在 templates 裡有同樣檔名的 html。
要注意 html 的開頭需要宣告 <html xmlns:th="http://www.thymeleaf.org">
才能使用 thymeleaf 的特殊語法,像是引用資源
或是從後端直接傳值的方法
其實還有蠻多操作的,詳細請看下面連結
thymeleaf 一些基本教學
相關設定:
這邊我用的是 PostgreSql,就請代入自己使用的 DB 和其他設置
如果想看 JPA 最後組合出的 SQL 語法也可以加入:
重點一樣放在幾個 annotation,大致上就如同字面意思,應該不難理解,如果變數名稱與實際的 column name 相同,則不需要設定 @Column
這個 annotation。
這邊要提到的是 @GeneratedValue(strategy = GenerationType.IDENTITY)
這行,指的是 id 的產生方法,網路上大部分教學都是 GenerationType.AUTO
但這邊範例使用的是 PostgreSql,id 的產生方法上與一般 MySql 不太一樣,所以設定的值也不相同
Spring 這邊多了一層 Repository 用來定義 model 的方法,下面有三個介面裡面有實作一些基本的方法
@CrudRepository
=> 提供基本 CRUD 的方法@PagingAndSortingRepository
=> 繼承上面,並加入分頁與排序@JpaRepository
=> 繼承上面,並加入更多額外功能,例如批次操作使用上 @JpaRepository
最齊全,但事實上用不到這麼多功能,反而會造成系統負擔,所以應該根據情境使用 @CrudRepository
和 @PagingAndSortingRepository
@CrudRepository
就已經提供了基本的 find
、save
、delete
等功能了在撰寫自己的客製方法上,這邊 Spring 的設計就十分有趣了,他會根據你下的關鍵字自動幫你產生方法,例如:
而如果想要撰寫更複雜的 query 的話,也有能完全自訂義的做法,就是透過 @Query
這個 annotation,在裡面撰寫 JPQL 或者原生的 SQL 語法
這邊建議是寫 JPQL,這樣如果系統有更換資料庫的需求,才可以一併通用
這一段就是自訂義了 findByName 這個方法,JPQL 是針對 JPA 的實體查詢,所以 FROM 後面放的不是 table name 而是 Entity name,預設則是 class 的名稱,:name
則是會替換成下面傳入的參數 name
,也可以寫成:
參數則會按照數字順序代入
詳細擴充方法撰寫
JPQL 簡介
Spring Data JPA 自訂更新/刪除
這邊寫到 Service 的部分,開頭一定也是要寫個 @Service
annotation,宣告 @Autowired
的 annotation 可以讓 Spring 自動注入 Repository 的資源
基本上看到這邊也有概念了,Spring 不依賴原生方法去匯入資源以及創造實體,而是透過各種 annotation 去自動產生與掃描
在 Controller 之中使用也是如此:
透過 @Autowired
資源會自動注入,而不需要自己創建實體
這邊的邏輯有點混亂,要再多加研究跟實際運用
@OneToOne
的 annotation 中寫上 mappedBy 而後面的值是放入關聯 model 的變數名稱@OneToOne
裡面需要設定存取權限 cascade
並且設定關聯的對象,這邊要注意一點,被設定在 @JoinColumn
中的關聯欄位,不能在 model 中再次設定變數,否則會報錯邏輯基本上與 OneToOne
大同小異
cascade
權限設定:
+