CrudRepository (基本的CRUD操作) (最常用)
←繼承
PagingAndSortingRepository (新增分頁和排序的操作)
←繼承
JpaRepository (能力最強 ,新增了JPA相關的flush 操作)
CrudRepository 常用的幾個方法
CrudRepository = Crud + Repository
save()
當我們在使用save 方法的時候
Spring Data JPA 他就會根據這個object 的primary key
去資料庫檢查說這一個object 是否是存在
如果這個數據存在 ,那save方法就會去修改那一筆數據
如果數據不存在 ,save 方法就會去新增一筆新的數據出來
findById()
根據id的值去資料庫中查詢那一筆數據出來
返回類型是: Optional (Java8才新增的新的類型)
目的是為了減少 NullPointerException的發生
deleteById()
根據id的值去刪除資料庫中的那筆數據
自定義查詢條件
findByXxx的命名規則
public interface StudentRepository2 extends CrudRepository<Student, Integer> {
// findByName >根據 name 的值來查詢 student
// 返回的類型可以自定義
// 通常是返回 Student 或 List<Student>
// select * from Student where name=?
List<Student> findByName(String name); // 參數會傳進去
// findByIdAndName >根據 id and name 的值來查詢 student
// select * from Student where id=? and name=?
// 參數按照順序傳進去 ,參數名字不重要
List<Student> findByIdAndName(Integer id ,String name);
// 根據 id 的值來查詢 student,並且根據 name 的值排序
// select * from student where id = ? order by name asc
List<Student> findByIdOrderByNameAsc(Integer id);
// 找出 name 的值的結尾為參數 suffix 的值那些 student
// select * from student where name like '%?'
List<Student> findByNameEndingWith(String suffix);
}
原生SQL查詢 @Query
目的: 用來解決 findByXxx 無法寫出複雜查詢邏輯的問題
用途: 在 Spring Data JPA 中 ,執行原生的SQL語法
package com.example.demo.JPA;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import java.util.List;
public interface StudentRepository2 extends CrudRepository<Student, Integer> {
// 在問號後面加上數字 ,指定要載入第幾個參數的值
// 指定哪一種SQL來撰寫 nativeQuery true:一般的SQL語法 ,false:JPQL (JPA提供的JPQL寫法)
@Query(value = "select id ,name from student where id=?1 and name=?2" ,nativeQuery = true)
Student test(Integer id ,String name);
}
@Query vs findByXxx
Spring Data JPA 他是一個ORM 的框架
他的宗旨就是去減少SQL語法的撰寫
所以優先使用 findByXxx 的命名規則
複雜的邏輯才使用 @Query