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

    写在最后

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

     相关推荐:

  • 相关阅读:
    LintCode2016年8月22日算法比赛----骰子求和
    LintCode2016年8月22日算法比赛----平面列表
    LintCode2016年8月22日算法比赛----将数组重新排序以构造最小值
    LintCode2016年8月22日算法比赛----克隆二叉树
    Leetcode算法比赛----Longest Absolute File Path
    Leetcode算法比赛----First Unique Character in a String
    vue运行报错Error: listen EADDRNOTAVAIL 192.168.1.105:8080
    vue使用lrz插件压缩图片
    <input type="file">原型难看
    vue创建全局变量以及全局方法
  • 原文地址:https://www.cnblogs.com/Marydon20170307/p/14134373.html
Copyright © 2020-2023  润新知