我們在數據庫中進行復雜的操作時會用到存儲過程,在數據庫中存儲過程是可被外部挪用的一種數據對象,可以用來封裝復雜的sql邏輯,那么我們在Spring Data JPA中是若何挪用存儲過程的呢?這就需要我們今天要講的@Procedure注解了。
起首我們來看一下@Procedure注解的源碼,經由過程源碼可以進修JPA對存儲過程的撐持。下圖中value暗示數據庫里面存儲過程的名稱,procedureName也是數據庫里面存儲過程的名稱。
接下來我們在數據庫中建立一個存儲過程,這個存儲過程有兩個參數,別離是輸入和輸出。
CREATE DEFINER=`root`@`localhost` PROCEDURE `pluslinout`(IN arg int, OUT res int)
BEGIN
SELECT(arg + 10) into res;
END
我們還可以建立有一個只有輸入的存儲過程,如下所示:
CREATE DEFINER=`root`@`localhost` PROCEDURE `pluslin`(IN arg int)
BEGIN
SELECT(arg + 10) into arg;
END
存儲過程的挪用,在UserRepository中,利用@Procedure(name="pluslin")和@Procedure(name="pluslinout")去挪用存儲過程。
在User實體類中存儲過程需要利用@NamedStoredProcedureQueries注解,將存儲過程綁心猿意馬到JPA的數據庫表中,procedureName是存儲過程的名字,name是JPA中存儲過程的名字,寫當作一致即可。@StoredProcedureParameter注解指心猿意馬存儲過程中利用的IN/OUT參數。
@NamedStoredProcedureQueries({
@NamedStoredProcedureQuery(name = "pluslin", procedureName = "pluslin", parameters = {
@StoredProcedureParameter(mode = ParameterMode.IN, name = "arg", type = Integer.class) }),
@NamedStoredProcedureQuery(name = "pluslinout", procedureName = "pluslinout", parameters = {
@StoredProcedureParameter(mode = ParameterMode.IN, name = "arg", type = Integer.class),
@StoredProcedureParameter(mode = ParameterMode.OUT, name = "res", type = Integer.class) }) })
最后在單位測試中測試這兩個挪用存儲過程的方式,測試的方式如下圖所示,測試的成果不再展示了,可以自行操練。
0 篇文章
如果覺得我的文章對您有用,請隨意打賞。你的支持將鼓勵我繼續創作!