Ibatis是咱們常常使用的O/R映射框架,mybats是ibatis被Google收購後從新命名的一個工程,固然也作了大量的升級。而調用存儲過程也是一次額C/S架構模式下常常使用的手段,咱們知道,ibatis調用存儲過程有一個專門的標籤<procedure>,在mybats裏面已經沒有這本標籤了,而是經過一個參數statementType="CALLABLE"來區分。廢話很少說,直接看怎麼寫吧!java
測試環境:mybats3.0.4 + sqlserver2008 +Spring3.1.1sql
存儲過程:數據庫
use base_passport go create proc yhj_test @input_a int, @input_b int, @output_c int out as begin select * from config.city; set @output_c = @input_a*@input_b; return @input_a+@input_b; end
Mybats配置:架構
<resultMap type="java.util.HashMap" id="resultMap"> <result column="city_key" property="cityKey" javaType="java.lang.Integer" jdbcType="INTEGER"/> <result column="province_key" property="provinceKey" javaType="java.lang.Integer" jdbcType="INTEGER"/> <result column="city_name" property="cityName" javaType="java.lang.String" jdbcType="VARCHAR"/> </resultMap> <select id="testByProc" statementType="CALLABLE" parameterType="java.util.HashMap" resultMap="resultMap"> <![CDATA[ {#{d,mode=OUT,jdbcType=INTEGER}=call dbo.yhj_test( #{a,mode=IN,jdbcType=INTEGER}, #{b,mode=IN,jdbcType=INTEGER}, #{c,mode=OUT,jdbcType=INTEGER} )} ]]> </select>
Java代碼app
Map<String, Object> paramMap = new HashMap<String, Object>(); paramMap.put("a", 2); paramMap.put("b", 3); List<City> citys = (List<City>) getTemplate().selectList(getNameSpaceAndMethod("testByProc"), paramMap); return citys;
經過以上代碼咱們便可獲取對應的結果集,return參數和output參數。其中return參數和output參數放在傳入的paramMap中,其中,c是存儲過程的output參數,而d爲return參數。框架
須要注意的事項:函數
一、 存儲過程的參數和名稱無關,只和順序有關係sqlserver
二、 存儲過程的output參數,只能經過傳入的map獲取測試
三、 存儲過程返回的結果集可直接用返回的map接收spa
四、 存儲過程的return結果須要使用?=call procName(?,?)的第一個參數接收,須要指定對應的mode爲OUT類型
五、 存儲過程對應的數據類型爲枚舉類型,須要使用大寫,如VARCHAR
要點:output是在存儲過程當中的參數的返回值(輸出參數),而ReturnValue是存儲過程返回的值(使用return關鍵字),一個存儲過程能夠有任意多個依靠參數返回的值,但只有一個ReturnValue。
獲取存儲過程的返回值--經過查詢分析器得到
存儲過程大致分紅三類:
一、返回記錄集的存儲過程:執行結果是一個記錄集,例如,從數據庫中檢索出符合某一個或幾個條件的記錄。
二、返回數值得的存儲過程(也可稱爲標量存儲過程),其執行完後返回一個值,例如數據庫中執行一個有返回值的函數或命令。
三、行爲存儲過程,用來實現數據庫的某個功能,而沒有返回值,例如在數據庫中的更新和刪除操做。
另外:含有return的存儲過程其返回值爲return返回的那個值。
沒有return的存儲過程,不管執行結果又無結果集,其返回值都是0,
帶有輸出參數的存儲過程,若是有RETURN則返回RETURN返回的那個值,若是要SELECT輸出參數,則出現輸出參數的值,和有無RETURN無關。
轉自:http://yhjhappy234.blog.163.com/blog/static/316328322012455714892/