Spring jdbc 提供了jdbcTemplate 對象,該對象定義了 execute 方法可用於執行存儲過程。該方法存在許多重載方式,我們使用的是execute(CallableStatementCreator csc, CallableStatementCallback<T> action)。
CallableStatementCreator 對象用於定義調用存儲過程的入參與出參。CallableStatementCallback 對象用於定義執行以及接受存儲過程的返回值。這兩個對象都採用lambda表達式來實現,因爲這樣比匿名函數更簡潔。
以下是以通用的方式來執行存儲過程:
jdbcTemplate.execute(con -> {
String proc = sql;
CallableStatement cs = con.prepareCall(proc);
log.debug("開始註冊入、出參 ->>");
//註冊入參
int currentIndex = 1;
for (int i = 1; i <= inParamValues.size(); i++) {
cs.setObject(i, inParamValues.get(i - 1));
currentIndex++;
}
//註冊出參
for (int i = currentIndex; i < outParamNames.size() + currentIndex; i++) {
cs.registerOutParameter(i, Types.JAVA_OBJECT);
}
log.debug("註冊入、出參成功 <<-");
return cs;
}, (CallableStatementCallback<Object>) cs -> {
cs.execute();
return null;
});
註冊入參時,利用CallableStatement 對象的setObject() 方法來傳遞入參,這樣我們就無須把入參轉換爲相應的類型。
註冊出參時,把Types.JAVA_OBJECT傳入 CallableStatementCallback對象的registerOutParameter() 方法,這也是爲了統一處理。
在 CallableStatementCallback對象中,直接返回 null。當然這裏也可以根據實際需要來返回相應的實例對象。