昨日,我們直接利用實作來感受 Spring Data JPA
的快速開發,會發現到我們只要建立 Entity
,就可以幫助我們做資料庫映射來新增資料表與欄位,而此特性就是 Object-Relation Mapping
-簡稱 ORM,就是將資料庫的內容映射為物件,讓我們可以用操作物件的方式對資料庫進行操作,而不用直接使用 SQL 語法對資料庫進行操作,甚至我們不用管底層的資料庫系統是什麼樣的資料庫,例如 SQL Server、MySQL,僅須使用同一套語法撰寫存取資料庫的邏輯,大幅降低程式與資料庫之間的耦合關係。
再來,我們來深入了解什麼是 Spring Data JPA
,它其實是 Spring 與 JPA 的整合,JPA
是一種 ORM 規範,是 Hibernate
(ORM 框架)的一個抽象,就像 JDBC 與 JDBC driver的關係,Hibernate 實作了 JPA 定義的規範,而 Spring Data JPA 則是基於 JPA 對資料庫溝通層進行封裝的應用框架,目標是希望簡化資料庫溝通層操作,內部涵蓋許多針對資料庫資料操作的解決方案。
昨日我們在實作程式有建立一個 StudentDao
程式,而所謂 DAO 其實是 Data Access Object
資料存取物件的縮寫,而資料持久層的意思就是把資料儲存的相關操作從原本架構解耦,即降低程式與資料庫的相依性,獨立出一個專門處理相關事務邏輯的物件,達到不同資料庫的統一存取方法,單一職責原則。
上面我們介紹了 DAO 物件,我們再介紹一個物件-DTO,此物件的作用如同名稱,主要是作為傳輸資料所使用,使用 DTO 可以讓我們減少參數傳遞的混亂,增加程式可讀性,也具備封裝性與擴充性,可以讓我們將一些必要傳遞但不希望被操作的資料進行封裝,或如果業務需要增加傳遞資料或對傳遞資料進行特定處理,只需要在物件增加欄位或修改即可。
昨日我們在撰寫 Dao 程式中會去實作 JpaRepository
與 JpaSpecificationExecutor
介面,而此兩個介面內容就是 Spring Data 所設計的基礎資料庫操作方法,可以讓類別實作後就可以輕易操作資料庫動作。JpaRepository 是提供基本 CRUD 相關操作方法,JpaSpecificationExecutor 則是提供一些複雜查詢方法,我們可以直接使用方法名稱快速進行資料庫操作,如下範例:
此文章有提供範例程式碼在 Github 供大家參考
在昨天的範例中,我們增加一個專案需求-利用姓名參數查詢學生資料:
在 StudentDao 加入 findByName 函數
fun findByName(name: String): Student?
在 StudentController 加入「查詢指定姓名的學生資料」函數- getStudentByName 函數
@RestController
@RequestMapping("/api")
class StudentController(@Autowired val studentDao: StudentDao) {
/**
* 取得 Student 所有資料
*/
@GetMapping("/students")
fun getStudentData(): MutableList<Student> {
return studentDao.findAll()
}
/**
* 新增 Student 資料
*/
@PostMapping("/students")
fun addStudentData(@RequestBody student: Student): Student {
return studentDao.save(student)
}
/**
* 查詢指定姓名的學生資料
*/
@PostMapping("/students/search")
fun getStudentByName(@RequestParam name: String): Student? {
return studentDao.findByName(name)
}
}
在 Student.http 加入測試API 方法
### 利用姓名參數查詢學生資料
POST http://localhost:8080/api/students/search?name=Devin
Content-Type: application/json
最後再進行測試,假設我們資料庫的學生資料表有 Devin 這筆資料時,我們應得到以下結果:
上面範例就是我們使用 Spring Data JPA 的方法名稱特性進行查詢的範例,其餘方法名稱的查詢規則,我們可以到 Spring Data JPA 官網進行查詢,官網在規則這塊寫的非常清楚,此部份就不再補充,建議大家可以邊查詢邊撰寫程式進行測試,官網內容如下圖:
此文章有提供範例程式碼在 Github 供大家參考