myBatis3执行存储过程

使用myBatis3执行存储过程不像iBatis2那样,有procedure这样的标签可以供使用,如下为iBatis2的使用方法:

<procedure id="provCitySplit" parameterMap="provCitySplitParameterMap" resultClass="java.lang.Long">

  {call PKG_SUB_POLICY.PROV_CITY_SPLIT(?,?,?,?)}

</procedure>

parameterMap="provCitySplitParameterMap"的定义如下:

<parameterMap class="map" id="provCitySplitParameterMap">

  <parameter property="subPolicyId" jdbcType="DECIMAL" javaType="java.lang.Long" mode="IN"/>

  <parameter property="cityId" jdbcType="DECIMAL" javaType="java.lang.Long" mode="IN"/>

  <parameter property="fetchNum" jdbcType="DECIMAL" javaType="java.lang.Long" mode="IN"/>

  <parameter property="resultCode" jdbcType="DECIMAL" javaType="java.lang.Long" mode="OUT"/>

</parameterMap>


java调用方法如下:

@Override

public Long callProvCitySplitProcedure(Long subPolicyId, Long cityId,

    Long fetchNum) throws SQLException {

  Map<String, Long> map = new HashMap<String, Long>();

  map.put("subPolicyId", subPolicyId);

  map.put("cityId", cityId);

  map.put("fetchNum", fetchNum);

  SqlMapSession sqlMapSession = sqlMapClient.openSession();

  try {

    sqlMapSession.update("PROCEDURE.provCitySplit", map);

    Long resultCode = map.get("resultCode");

    return resultCode;          

  } catch (SQLException e) {

    throw new SQLException(e);

  } finally {

    if (sqlMapSession.getCurrentConnection() != null) {

      System.out.println("Get CurrentConnection and close...");

      sqlMapSession.getCurrentConnection().close();

    }

    sqlMapSession.close();

  }

}

 

而mybatis3已经没有procedure这样的标签,只剩下select来操作存储过程,使用方法如下:

<select id="cancelSubPolicy" statementType="CALLABLE">

    {call p_cancel_sub_policy(#{subPolicyId, jdbcType=NUMERIC, mode=IN},

                              #{canceledCount, jdbcType=NUMERIC, mode=OUT})}

</select>

java调用方法如下:

public long cancelSubPolicy(Integer coreDBId, Long subPolicyId) throws SQLException {

    SqlSession sqlSession = null;

    try {

        sqlSession = sessionFactory.openSession();

        final Map<String, Object> param = new HashMap<String, Object>();

        param.put("subPolicyId", subPolicyId);

        long time = System.currentTimeMillis();

        sqlSession.select("com.ailk.dm.odomain.dms.dao.MultiTaskDao.cancelSubPolicy", param, null);

        log.info("cancelSubPolicy elapsed time: " + (System.currentTimeMillis() - time) + "ms");

        BigDecimal canceledCount = (BigDecimal) param.get("canceledCount");

        // return canceled task count;

        return canceledCount.longValue();

    } catch (PersistenceException pe) {

        log.error("cancelSubPolicy failed: subPolicyId=" + subPolicyId, pe);

        throw new SQLException(pe);

    } finally {

        if (null != sqlSession) sqlSession.close();

    }

}

你可能感兴趣的:(myBatis3执行存储过程)