Spring Data中findById和getById的區別
一、概述
Spring Data 提供了從數據存儲中檢索實體的便捷方法,包括findById
和getById
。儘管乍一看它們可能很相似,但它們之間存在細微差別,可能會影響我們代碼的功能。
本教程將探討這些差異並幫助我們確定何時有效地使用每種方法。
2. 理解findById
首先,讓我們看一下findById
方法。
2.1.方法簽名
findById
方法定義在CrudRepository
接口中:
Optional<T> findById(ID id);
2.2.行為和返回類型
findById
方法通過其唯一標識符 (id) 檢索實體。它返回一個Optional
包裝器,指示該實體可能存在也可能不存在於數據存儲中。如果找到實體,它將被包裹在Optional
中。否則, Optional
將為空。
2.3.用例
在一些用例中, findById
是更好的選擇。
第一種是當我們期望實體可能不存在於數據存儲中並且希望優雅地處理這兩種情況(找到和未找到)時。
此外,當我們想將它與 Java 8 Optional
API 結合使用以執行條件操作或在找不到實體時執行回退邏輯時,它會很方便
3. 探索getById
接下來,讓我們探討一下getById
方法。
3.1.方法簽名
JpaRepository
接口定義了getById
方法:
T getById(ID id);
3.2.行為和返回類型
與findById
不同, getById
方法直接返回實體,而不是將其包裝在Optional
中。如果數據存儲中不存在該實體,將拋出EntityNotFoundException
。
3.3.用例
當我們確定具有給定 id 的實體存在於數據存儲中時,我們可以使用getById
。此方法還提供了更簡潔的語法並避免了額外的Optional
處理的需要。
4.選擇正確的方法
最後,讓我們考慮幾個可以幫助我們確定是使用findById
還是getById
因素:
- 存在保證:如果保證實體的存在,如果不存在就是異常情況,首選
getById
。這種方法避免了不必要的Optional
處理並簡化了代碼。 - 可能不存在:如果實體的存在不確定,或者我們需要優雅地處理已找到和未找到的情況,請將
findById
與Optional
API 一起使用。這種方法允許我們在不拋出異常的情況下執行條件操作。 - 從 Spring Boot 2.7 版本開始,
getById
方法被標記為已棄用,文檔建議改用getReferenceById
方法。
5.結論
在本教程中,我們了解了 Spring Data 中findById
和getById
方法之間的區別。 findById
返回一個Optional
並優雅地處理實體不存在的情況,而getById
直接返回實體並在實體不存在時拋出異常。兩種方法之間的選擇取決於實體的存在是有保證的還是不確定的,以及是否需要異常處理或條件操作。
因此,我們可以選擇最符合我們應用程序邏輯和要求的一種。