Mybatis如何調用有返回值的存儲過程


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 實體類

報錯信息


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM