Mybatis框架調用有返回值的存儲過程的參數必須為Map或者自定義實體類,以下分別為兩者的使用案例(無論是Springboot框架還是SpringMVC都可使用此案例【這句話僅針對小白】):
附加:以下接收返回值的參數名 result 可自定義,如:yourParamName,類型也可根據返回類型自定義,如:String。如果使用實體類的方法調存儲過程,則實體類中用於接收返回值的屬性是必須要添加的;如果使用Map的方法調存儲過程,則用於接收返回值的key可添加也可不添加,因為mybatis會自動將用於接收返回值的參數名及返回值添加到Map中。如果出現這種報錯信息,檢查自己調用的存儲過程名字是否寫錯
方法一:
使用Map作為參數調用有返回值的存儲過程
//以下為Java接口實現代碼
@Transactional
public Map<String, Object> removeOrderItems(Integer kpoiId) {
Map<String, Object> map = new HashMap<>();
Map<String,Integer> param = new HashMap<>();//由於mybatis調有返回值的存儲過程參數必須為map或者某一個類,因此此處使用map
param.put("kpoiId",kpoiId);//參數
//key名 result可以事先put到map中,傳個默認值,也可以不設置,mybatis會自動將接收返回值的參數名以及值put到Map中
kitchenPurchaseOrderItemsMapper.deletePurchaseOrder(param);//會將返回值放入到參數map中,key名為result
map.put("code",param.get("result"));
return map;
}
//以下為Java Mapper接口聲明方法
@Mapper
public interface KitchenPurchaseOrderItemsMapper {
void deletePurchaseOrder(Map param);
}
<!--以下為Mybatis Mapper.xml具體調用的代碼-->
<select id="deletePurchaseOrder" statementType="CALLABLE">
{call purchase_remove_order(
#{kpoiId,mode=IN,jdbcType=INTEGER},
#{result,mode=OUT,jdbcType=INTEGER}
)}
</select>
<!--注意:接收返回值的參數一定要加上 mode=OUT 如:#{result,mode=OUT,jdbcType=INTEGER}-->
方法二:
使用自定義實體類作為參數調用有返回值的存儲過程
查看 KitchenPurchaseSupplier實體類 詳情
//以下為Java接口實現代碼
/**
*@Transactional事務注解一般用在需要修改數據庫次數大於1的情況,(rollbackFor = Exception.class)這個部分是當具體實現時進行了try{}catch(Exception e){}的情況才需要加,否則不用加
*Exception.class是根據catch捕獲的異常而定,一般沒有特殊需求為了代碼的簡潔易懂和方便下次的復制粘貼,直接用Exception 即可
*/
@Transactional(rollbackFor = Exception.class)
public Map<String, Object> savePurchaseSupplier(String info) {//info是由前端傳過來的json字符串信息
Map<String, Object> map = new HashMap<>();
if(info != null){
try {
KitchenPurchaseSupplier supplier =GsonUtil.parseJsonWithGson(info,KitchenPurchaseSupplier.class);//通過Gson將json字符串轉換為實體類對象,此類可根據自己實際業務需求自行定義
purchaseSupplierMapper.insertPurchaseSupplier(supplier);//調用有返回值的存儲過程
map.put("code",supplier.getResult());//拿到存儲過程返回的處理結果
} catch (Exception e) {
e.printStackTrace();
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();//當方法上有@Transactional注解時,代碼進行了異常捕獲后需要手動進行事務回滾,如果沒有catch異常則不需要寫這句話
map.put("code",0);
}
}else{
map.put("code",0);
}
return map;
}
//以下為Java Mapper接口聲明方法
@Mapper
public interface PurchaseSupplierMapper {
void insertPurchaseSupplier(KitchenPurchaseSupplier info);
}
<!--以下為Mybatis Mapper.xml具體調用的代碼-->
<select id="insertPurchaseSupplier" statementType="CALLABLE">
{call purchase_save_supplier(
#{goodsId,jdbcType=INTEGER},
#{wsId,jdbcType=INTEGER},
#{wsName,jdbcType=VARCHAR},
#{wsRemark,jdbcType=VARCHAR},
#{price,jdbcType=REAL},
#{expireDate,jdbcType=DATE},
#{result,mode=OUT,jdbcType=INTEGER}
)
}
</select>
<!--注意:接收返回值的參數一定要加上 mode=OUT 如:#{result,mode=OUT,jdbcType=INTEGER}-->
KitchenPurchaseSupplier 實體類

報錯信息

