ibatis 调用存储过程

1.返回系统游标集合

说明:调用的是oracle存储过程

示例一:多个参数,手动映射返回字段

  第一步:参数配置(入参、出参)

<!-- property属性指定HashMap的具体键,虽然Map是无序的但是存储过程的入参顺序会按照parameter标签的排列顺序执行,mode属性指定入参或返回值 -->
<parameterMap class="java.util.HashMap" id="SHEHE_ERROR_Map">
    <parameter property="FRCODE" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN" />
    <parameter property="FORGID" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN" />
    <parameter property="START" jdbcType="NUMBER" javaType="java.lang.Integer" mode="IN" />
    <!-- 当oracle数据库参数是number类型时,必须得指定java与oracle数据类型的对应关系 -->
    <parameter property="END" jdbcType="NUMBER" javaType="java.lang.Integer" mode="IN" />
    <!-- 当oracle数据库参数是游标时,必须得指定java与oracle数据类型的对应关系 -->
    <parameter property="out_cur" jdbcType="ORACLECURSOR" javaType="java.sql.ResultSet" mode="OUT" />
</parameterMap>

  第二步:返回值,将返回值封装到HashMap中

<resultMap class="java.util.HashMap" id="directoryMonitor_out_cursor">
    <!-- column代表的是返回的字段,property代表的是HashMap的键,指定具体的键负责接收 -->    
    <result property="FORGID" column="FORGID"/>
    <result property="FORGNAME" column="FORGNAME"/>
    <result property="FCENNAME_TEM_COUNT" column="FCENNAME_TEM_COUNT"/>
    <result property="ISNULLCENCODE_COUNT" column="ISNULLCENCODE_COUNT"/>
    <result property="TOTALCOUNT" column="TOTALCOUNT"/>
</resultMap>

  第三步:调用存储过程

<!-- ?号的个数须与<parameter>标签的个数保持一致 -->
<procedure id="getSHEHE_ERROR_DATA" parameterMap="SHEHE_ERROR_Map" resultMap="directoryMonitor_out_cursor">
       <![CDATA[
          {call PRC_DIAITEM_MONITOR(?,?,?,?,?)}
       ]]>
</procedure>

2020/04/18

  说明:参数映射parameterMap的步骤不能省略(第一步);

  返回值映射可以省略(第二步);

  另外,mode的值:IN或者OUT必须大写;

  只有当数据库的字段是varchar2类型时,可以和java的String类型自动匹配,也就是不用声明javaType和jdbcType,否则其他数据类型都得指定匹配对象。

  不然就会报这个错。

示例二:只有一个参数,自动映射返回数据

<!-- 指标三级查询 -->
<!-- ?映射,和?数量保持一致 -->
<parameterMap class="java.util.HashMap" id="indexMap">
    <!-- 游标cursor必须声明属性javaType和jdbcType,并设置值 -->
    <parameter property="OUT_CURSOR" javaType="java.sql.ResultSet" jdbcType="ORACLECURSOR" mode="OUT"/>
</parameterMap>
<!-- parameterMap必须映射,resultMap可以不做映射,直接用resultClass接收返回的数据 -->
<procedure id="getIndexDetail" parameterMap="indexMap" resultClass="java.util.HashMap">
    <![CDATA[
        {call PRC_INDEX_SEARCH(?)}
    ]]>
</procedure>

20200616

  说明:当只有一个问号?,用于接收存储过程返回结果时,可以使用resultClass接收,不用映射返回数据,否则,返回的数据都要进行映射!!!

  不管是parameterMap还是resultMap,都可以做数据类型转换映射,这个视情况需要而改。

2022年2月20日17:14:41

备用

java:
void callProcForOracle(String procName, List<Object> paramList, List<Map<String, Object>> procResult);
xml:
<select id="callProcForOracle" statementType="CALLABLE">
      call ${procName} (
        <foreach collection="paramList" item="item" separator=",">
            #{item}
        </foreach>
        , #{procResult,mode=OUT,jdbcType=CURSOR,javaType=ResultSet,resultType=java.util.List}
      )
</select>

2022年6月24日11:04:05

2.存储过程调用只有入参没有出参

<select id="getDataverification" parameterClass="map">
    {call AAA(#ORGCODE#,#BATCHCODE#)}
</select>

如果只有入参,没有出现的话,可以使用select标签来代替。

3.存储过程出参只有一个,且不是集合

如果使用map或者实体类接收的话,必须封装到入参当中,而且,需要使用它来接收;

即使手动声明返回参数,返回参数还是会被塞到原来的map当中。

<!-- property属性指定HashMap的具体键,虽然Map是无序的但是存储过程的入参顺序会按照parameter标签的排列顺序执行,mode属性指定入参或返回值 -->
<parameterMap id="checkMap"  class="java.util.HashMap">
   <parameter property="ORGCODE" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN" />
   <parameter property="BATCH_CODE" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN" />
   <parameter property="TABLENAME" javaType="java.lang.String" jdbcType="VARCHAR" mode="OUT" />
</parameterMap>
<procedure id="getDataCheckTable" parameterMap="checkMap">
   {call STANDARD_XYH.PRO_ADATA_CHECK_TABLE(?, ?, ?)}
</procedure>

 

posted @ 2018-08-15 19:43  Marydon  阅读(3397)  评论(0编辑  收藏  举报