用過mybatis的應該都知道它是ibatis被Google收購后重新命名的一個工程,因此也做了大量升級。本文就來介紹下兩者在調用存儲過程上的一點區別,ibatis有一個專門的標簽<procedure>,在mybatis里面已經沒有這標簽了,而是通過一個參數statementType="CALLABLE"來區分。
存儲過程:
ALTER PROCEDURE [dbo].[Pro_Create_Number] @ChannelNo VARCHAR(10) ,--渠道號 @Number VARCHAR(50) OUTPUT --要輸出的編號 AS BEGIN -- 省略一萬字 Select @Number ; END;
ibatis配置寫法:
<parameterMap id="param" class="java.util.HashMap" > <parameter property="channelNo" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN"/> <parameter property="number" jdbcType="VARCHAR" javaType="java.lang.String" mode="OUT"/> </parameterMap> <procedure id="getNumber" parameterMap ="param" resultClass="java.lang.String"> {call [DBName].[dbo].[Pro_Create_Number](?,?)} </procedure>
mybatis配置寫法:
<parameterMap id="param" class="java.util.HashMap" > <parameter property="channelNo" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN"/> <parameter property="number" jdbcType="VARCHAR" javaType="java.lang.String" mode="OUT"/> </parameterMap> <select id="getNumber" parameterMap="param" statementType="CALLABLE" resultType="java.lang.String"> {call [DBName].[dbo].[Pro_Create_Number](?,?)} </select>
Java方法調用:
public String getNumber(String channelNo) { Map<String, String> parmap = new HashMap<String, String>(); parmap.put("channelNo", channelNo); String number = null; parmap.put("number", number); this.sqlSession.selectOne("getNumber", parmap); return parmap.get("number"); }
使用ibatis與mybatis調用存儲過程在xml配置的寫法上面代碼可以清晰看出,這里就不多說了,通過以上代碼我們即可獲取對應的結果集,return參數和output參數。其中return參數和output參數放在傳入的parmap中,其中,Number是存儲過程的output參數,而java變量number為return參數。
注意事項:
1、 存儲過程的參數和名稱無關,只和順序有關系
2、 存儲過程的output參數,只能通過傳入的map獲取
3、 存儲過程返回的結果集可直接用返回的map接收
4、 存儲過程的return結果需要使用?=call procName(?,?)的第一個參數接收,需要指定對應的mode為OUT類型
5、 存儲過程對應的數據類型為枚舉類型,需要使用大寫,如VARCHAR
output是在存儲過程中的參數的返回值(輸出參數),而ReturnValue是存儲過程返回的值(使用return關鍵字),一個存儲過程可以有任意多個依靠參數返回的值,但只有一個ReturnValue。
存儲過程主要分成三類:
1、返回記錄集的存儲過程:執行結果是一個記錄集,例如,從數據庫中檢索出符合某一個或幾個條件的記錄。
2、返回數值得的存儲過程(也可稱為標量存儲過程),其執行完后返回一個值,例如數據庫中執行一個有返回值的函數或命令。
3、行為存儲過程,用來實現數據庫的某個功能,而沒有返回值,例如在數據庫中的更新和刪除操作。
另外:含有return的存儲過程其返回值為return返回的那個值。
沒有return的存儲過程,無論執行結果又無結果集,其返回值都是0,
帶有輸出參數的存儲過程,如果有RETURN則返回RETURN返回的那個值,如果要SELECT輸出參數,則出現輸出參數的值,和有無RETURN無關。