跳转至

CrudRepository (基本的CRUD操作) (最常用)

←繼承

PagingAndSortingRepository (新增分頁和排序的操作)

←繼承

JpaRepository (能力最強 ,新增了JPA相關的flush 操作)

CrudRepository 常用的幾個方法

CrudRepository = Crud + Repository

public interface CrudRepository<T,ID>extends Repository<T,ID>{
}

save()

當我們在使用save 方法的時候

Spring Data JPA 他就會根據這個object 的primary key

去資料庫檢查說這一個object 是否是存在

如果這個數據存在 ,那save方法就會去修改那一筆數據

如果數據不存在 ,save 方法就會去新增一筆新的數據出來

// 去新增或是修改資料庫中的數據
<S extends T> S save(S entity); 

findById()

根據id的值去資料庫中查詢那一筆數據出來

返回類型是: Optional (Java8才新增的新的類型)

目的是為了減少 NullPointerException的發生

java.util.Optional<T> findById(ID id);

deleteById()

根據id的值去刪除資料庫中的那筆數據

void deleteById(ID 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