准備工作(新手看)
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>
執行結果如下:
語法:
{call 存儲過程名稱(#{變量名稱},#{變量名稱},...)}
這里需要注意的是:
第一,statementType的值必須是CALLABLE,貌似是告訴mybatis將要執行的是存儲過程;
第二,當返回數據類型使用map接收時,resultType的值可以有4種表現形式:java.util.Map/map/java.util.HashMap/hashmap;
第三,存儲過程入參使用IN,返回參數使用OUT(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條只是為了證明不影響正常執行,也就是不規范的用法,最好還是遵守。