mybatis 呼叫儲存過程 示例
準備工作(新手看)
1.建立一個mybatis對映類
只需要建立介面就行,無需建立實現類
2.建立一個mybatis對映檔案
注意:
mapper.xml的namespace必須和mapper.java類所在的全路徑保持一致,否則無法完成對映;
mapper.java的方法名稱必須和mapper.xml的id,名稱保持一致,否則方法和SQL匹配不上。
2.確保springboot能夠掃描到該類
3.確保spring能夠掃描到mapper.xml
在application.yml配置檔案中指定掃描路徑
具體實現:
說明:這裡呼叫的是mysql儲存過程。
方式一:入參全部羅列出來,返回引數用map接收;
java方法
Map<String, String> getOrgCurrentno(String orgCode, String invoicingClerk, String ivcType, String medicalType);
xml
<!-- id="getOrgCurrentno"一定要與dao層需要匹配的方法名一致 --> <select id="getOrgCurrentno" statementType="CALLABLE" resultType="java.util.Map"> <![CDATA[ {call PRO_GET_IVCVOUCHER_NUMBER(#{orgCode,mode=IN,jdbcType=VARCHAR}, #{invoicingClerk,mode=IN,jdbcType=VARCHAR}, #{ivcType,mode=IN,jdbcType=VARCHAR}, #{medicalType,mode=IN,jdbcType=VARCHAR}, #{aaa,mode=OUT,jdbcType=VARCHAR}, #{bbb,mode=OUT,jdbcType=VARCHAR})} ]]> </select>
執行結果如下:
這裡需要注意的是:
第一,statementType的值必須是CALLABLE,貌似是告訴mybatis將要執行的是儲存過程;
第二,當返回資料型別使用map接收時,resultType的值可以有4種表現形式:java.util.Map/map/java.util.HashMap/hashmap;
第三,儲存過程入參使用IN,返回引數使用OUT;
第四,引數型別需要指定對應的jdbc型別;
第五,當使用map接收返回引數時,在xml中指定的名稱與儲存過程實際返回的引數名稱並沒有關係,例如:我上面隨便起的aaa,bbb,對儲存過程返回結果絲毫沒有產生影響;
方式二:入參用java類,返參用map。
java方法
Map<String, String> getOrgCurrentno2(Map<String, String> paramsMap);
xml
<select id="getOrgCurrentno2" parameterType="map" statementType="CALLABLE" resultType="hashmap"> <![CDATA[ {call PRO_GET_IVCVOUCHER_NUMBER(#{aa,mode=IN,jdbcType=VARCHAR}, #{bb,mode=IN,jdbcType=VARCHAR}, #{cc,mode=IN,jdbcType=VARCHAR}, #{dd,mode=IN,jdbcType=VARCHAR}, #{ee,mode=OUT,jdbcType=VARCHAR}, #{ff,mode=OUT,jdbcType=VARCHAR})} ]]> </select>
返回的資料是一樣的。
第六,到這裡,我們就可以得出這樣的結論:
入參和返參的引數名稱對於mysql來說,沒有絲毫影響,即使雙方的名稱不一樣,只要保證順序一樣就是OK的;
第七,經過我的測試發現:
當入參使用map時,parameterType屬性是可以不宣告的,執行起來沒有任何影響。
前4條是硬性規範,後3條只是為了證明不影響正常執行,也就是不規範的用法,最好還是遵守。
寫在最後
哪位大佬如若發現文章存在紕漏之處或需要補充更多內容,歡迎留言!!!