spring中呼叫儲存過程

2021-08-29 15:27:39 字數 2164 閱讀 2750

org.springframework.jdbc.object.storedprocedure是對應儲存過程呼叫的操作物件,它通過其父類org.springframework.jdbc.object.sqlcall獲得相應的底層api支援(callablestatementcreator), 然後在此基礎之上構建了呼叫儲存過程的執行方法。

storedprocedure是抽象類,所以需要實現相應子類以封裝對特定儲存過程的呼叫,還記得我們在講解jdbctemplate呼叫儲存過程時候定義的儲存過程嗎?

create procedure counttable(in tablename varchar(1000),out sqlstr varchar(1000) , inout v int)

begin

set @flag = v;

set @sql = concat('select count(*) into @res from ' , tablename , ' where active_flag=?');

prepare stmt from @sql;

execute stmt using @flag;

deallocate prepare stmt;

set v = @res;

set sqlstr = @sql;

end

通過繼承storedprocedure,我們可以為該儲存過程的呼叫提供乙個對應的操作物件:

public class counttablestoredprocedure extends storedprocedure 

public counttableresult docounttable(string tablename,integer v)

}

關於該儲存過程操作物件,部分細節我們有必要關注一下:

storedprocedure提供了execute方法執行儲存過程呼叫,通過map的形式傳入呼叫所需要的in或者inout型別的引數值, 所以,在構建引數map的時候,該map中的key應該與declareparameter時候宣告的引數名稱相同; 另外,execute執行後返回的結果也是map形式,從該結果map中取得具體的結果值的時候,也是通過declareparameter中宣告的out/inout引數名作為key來獲取的, 所以,這就是我們將各個引數的名稱在類定義的開始宣告為常量的原因:

public static final string in_parameter_name = "tablename";

public static final string out_parameter_name = "sqlstr";

public static final string inout_parameter_name = "v";

無論是輸入引數map還是輸出引數結果對應的map,他們中的key應該與通過declareparameter方法宣告的引數名稱一一對應。

通過擴充套件storedprocedure,我們不但封裝了引數的宣告和結果的提取,我們還為呼叫方提供了強型別的呼叫方法, 現在,呼叫方可以通過docounttable方法的強型別引數宣告傳入引數值,並取得強型別的counttableresult物件作為結果,而不是泛泛的乙個map。

對於儲存過程的呼叫者來說,它的**現在可以簡潔到兩行**:

// datasource datasource = ...;

counttablestoredprocedure storedprocedure = new counttablestoredprocedure(datasource);

counttableresult result = storedprocedure.docounttable("tablename",1);

...

漂亮多了,不是嗎?

public class oraclestoredprocedure

; arraydescriptor desc = new arraydescriptor("numbers", connection);

array nums = new array(desc, connection, params);

inmap.put("arrayparametername", nums);

...return inmap;

}};}

}

Spring呼叫儲存過程

public boolean bindcard final bindcardprofile bindcardprofile throws dataacces ception string dbreturn jdbctemplate.execute new callablestatementcreat...

Spring呼叫儲存過程

public boolean bindcard final bindcardprofile bindcardprofile throws dataacces ception string dbreturn jdbctemplate.execute new callablestatementcreat...

FAQ系列 Spring框架中呼叫儲存過程失敗

spring框架中,呼叫儲存過程同時還需要show create procedure許可權,對於普通使用者而言,還要授予 select on mysql.proc 許可權才能正常 分割線 知數堂 培訓是由資深mysql專家葉金榮 吳炳錫聯合推出的專業優質培訓品牌,主要有mysql dba實戰優化和p...