准备工作(新手看)
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条只是为了证明不影响正常执行,也就是不规范的用法,最好还是遵守。