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>

  执行结果如下:

  语法:

  {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条只是为了证明不影响正常执行,也就是不规范的用法,最好还是遵守。  

写在最后

  哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!

 相关推荐:

原文地址:https://www.cnblogs.com/Marydon20170307/p/14134373.html