iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 17
0
Modern Web

30天從零撰寫 Kotlin 語言並應用於 Spring Boot 開發系列 第 17

[Day 17] 遠征 Kotlin × 使用 Spring Data JPA 操作資料庫 (2)

ORM 介紹

昨日,我們直接利用實作來感受 Spring Data JPA 的快速開發,會發現到我們只要建立 Entity,就可以幫助我們做資料庫映射來新增資料表與欄位,而此特性就是 Object-Relation Mapping-簡稱 ORM,就是將資料庫的內容映射為物件,讓我們可以用操作物件的方式對資料庫進行操作,而不用直接使用 SQL 語法對資料庫進行操作,甚至我們不用管底層的資料庫系統是什麼樣的資料庫,例如 SQL Server、MySQL,僅須使用同一套語法撰寫存取資料庫的邏輯,大幅降低程式與資料庫之間的耦合關係

Spring Data JPA 介紹

再來,我們來深入了解什麼是 Spring Data JPA,它其實是 Spring 與 JPA 的整合,JPA 是一種 ORM 規範,是 Hibernate(ORM 框架)的一個抽象,就像 JDBC 與 JDBC driver的關係,Hibernate 實作了 JPA 定義的規範,而 Spring Data JPA 則是基於 JPA 對資料庫溝通層進行封裝的應用框架,目標是希望簡化資料庫溝通層操作,內部涵蓋許多針對資料庫資料操作的解決方案。

資料持久層 Data Persistence Layer

昨日我們在實作程式有建立一個 StudentDao 程式,而所謂 DAO 其實是 Data Access Object 資料存取物件的縮寫,而資料持久層的意思就是把資料儲存的相關操作從原本架構解耦,即降低程式與資料庫的相依性,獨立出一個專門處理相關事務邏輯的物件,達到不同資料庫的統一存取方法,單一職責原則。

資料傳輸物件 Data Transfer Object (DTO)

上面我們介紹了 DAO 物件,我們再介紹一個物件-DTO,此物件的作用如同名稱,主要是作為傳輸資料所使用,使用 DTO 可以讓我們減少參數傳遞的混亂,增加程式可讀性,也具備封裝性與擴充性,可以讓我們將一些必要傳遞但不希望被操作的資料進行封裝,或如果業務需要增加傳遞資料或對傳遞資料進行特定處理,只需要在物件增加欄位或修改即可。

Spring Data JPA 方法定義規則

昨日我們在撰寫 Dao 程式中會去實作 JpaRepositoryJpaSpecificationExecutor 介面,而此兩個介面內容就是 Spring Data 所設計的基礎資料庫操作方法,可以讓類別實作後就可以輕易操作資料庫動作。JpaRepository 是提供基本 CRUD 相關操作方法,JpaSpecificationExecutor 則是提供一些複雜查詢方法,我們可以直接使用方法名稱快速進行資料庫操作,如下範例:

此文章有提供範例程式碼在 Github 供大家參考

在昨天的範例中,我們增加一個專案需求-利用姓名參數查詢學生資料:

  1. 在 StudentDao 加入 findByName 函數

    fun findByName(name: String): Student?
    
  2. 在 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)
        }
    }
    
  3. 在 Student.http 加入測試API 方法

    ### 利用姓名參數查詢學生資料
    POST http://localhost:8080/api/students/search?name=Devin
    Content-Type: application/json
    
  4. 最後再進行測試,假設我們資料庫的學生資料表有 Devin 這筆資料時,我們應得到以下結果:
    https://ithelp.ithome.com.tw/upload/images/20200926/20121179NNCI3LgF8I.png

上面範例就是我們使用 Spring Data JPA 的方法名稱特性進行查詢的範例,其餘方法名稱的查詢規則,我們可以到 Spring Data JPA 官網進行查詢,官網在規則這塊寫的非常清楚,此部份就不再補充,建議大家可以邊查詢邊撰寫程式進行測試,官網內容如下圖:
https://ithelp.ithome.com.tw/upload/images/20200926/20121179XTiujLHbvL.png

此文章有提供範例程式碼在 Github 供大家參考

Reference


上一篇
[Day 16] 遠征 Kotlin × 使用 Spring Data JPA 操作資料庫 (1)
下一篇
[Day 18] 遠征 Kotlin × Spring Boot 使用 RESTful API (1)
系列文
30天從零撰寫 Kotlin 語言並應用於 Spring Boot 開發30

尚未有邦友留言

立即登入留言