轉:http://zachary-guo.iteye.com/blog/1756689
Mybats 是 iBatis 被 Google 收購後重新命名的一個工程,當然也做了大量的更新。iBatis 2.x 調用存儲過程有一個專門的标簽 <procedure>,在 Mybats 3.x 裡面已經沒有這個标簽了,而是通過一個參數 statementType="CALLABLE" 來區分。
存儲過程有三種類型的參數,分别為 IN(輸入參數),OUT(輸出參數),INOUT(輸入輸出參數)。一個存儲過程,可以有多個 IN 參數,至多有一個 OUT 或 INOUT 參數。
◇ 隻有 IN 參數的存儲過程
Sql代碼

- CREATE PROCEDURE proc_only_input (
- @hello VARCHAR(8) IN
- ) AS
- ...
Xml代碼

- <select id="selectSth" statementType="CALLABLE" parameterType="hashmap">
- <![CDATA[
- { call proc_only_input(#{good, mode=IN, jdbcType=VARCHAR}) }
- ]]>
- </select>
Java代碼

- Map params = new HashMap();
- // 調用存儲過程的傳遞的參數名可以不和定義存儲過程的參數名保持一緻,隻要保證它們的順序是一緻的即可。
- params.put("good", "china");
- session.select("pkg.selectSth", params);
◇ 有 INOUT 或 OUT 參數的存儲過程
Sql代碼

- CREATE PROCEDURE proc_out (
- @yes VARCHAR(8) IN,
- @fly VARCHAR(16) OUT
- ) AS
- ...
- return \'return something\'
Xml代碼

- <!--
- 如果調用的過程中存在 out 參數,那麼所有的參數都必須用問号的形式傳入,如: { call test_procedure(?, ?, ?, ?)}。要是有參數不是問号形式傳入,如:{ call test_procedure(?, 3, ?, ?)},則會異常伺候:Output parameter not allowed as argument list prevents use of RPC
- 另外,對于有輸出參數的存儲過程,理論上也可以這樣寫:
- { #{gog, mode=OUT, jdbcType=VARCHAR} = call proc_out(#{yes, mode=IN, jdbcType=VARCHAR}) }
- 可我在 sql server 中嘗試這樣寫,報錯,說是卻是 @fly 參數(proc_out 的第二個參數的名字就是 fly)。既然如此,那我就一個一個參數的寫,就像下面的這樣。
- -->
- <select id="selectSth" statementType="CALLABLE" parameterType="hashmap">
- <![CDATA[
- { call proc_out(#{yes, mode=IN, jdbcType=VARCHAR}, #{gog, mode=OUT, jdbcType=VARCHAR}) }
- ]]>
- </select>
Java代碼

- Map params = new HashMap();
- // 調用存儲過程的傳遞的參數名可以不和定義存儲過程的參數名保持一緻,隻要保證它們的順序是一緻的即可。
- // 同時,存儲過程的輸出參數的值必須通過 map 來接收
- params.put("yes", "china");
- session.select("pkg.selectSth", params);
- // 得到輸出參數的值
- String result = params.(String) get("gog");