2

我们有一个 Oracle 存储过程,它以 SYS_REFCURSOR 类型的 OUT 参数返回其结果。我们想通过一个 MyBatis 映射器来调用它,@Select 注解中查询字符串的相关部分如下所示

@Select(value="call " + SCHEMA_NAME + "." + STORED_PROCEDURE_NAME +
      "(" + ...
      "#{" + P_RECORDSET_FIELD + ",javaType=java.sql.ResultSet,jdbcType=CURSOR,mode=OUT,resultMap=ownNameSpace.ownResultMap}," + 
       ...

其中 resultMap 属性指的是以下 XML 配置

<mapper namespace="ownNameSpace">
  <resultMap id="ownResultMap" type="com.ownpackage.OwnResultType">
    <result column="COLUMN_1" property="property1" />
    ...

这非常有效,DAO 类使用映射器成功地从数据库中检索到预期结果。然而,我们想知道是否有可能在没有 XML 的情况下仅使用注释来解决这个问题。MyBatis 有 @Results/@Result/@ResultMap 注释,我们成功地将其用于带有 ResultSet 的 SP,但到目前为止,我们还没有真正找到 OUT 参数的解决方案。类似的示例通常归结为使用混合注释+XML 配置。例如,以下教程的作者似乎遇到了同样的问题,尽管它已经有几年历史了:https ://dzone.com/articles/ibatis-mybatis-working-stored (请参阅第四个示例的注释)这是否可行有吗?

4

2 回答 2

2

试试这样。。

@Select(value = "{ CALL getTotalCityStateId(" +
        "#(stateCursor, mode=OUT, jdbcType=CURSOR," +
        "javaType=java.sql.ResultSet,resultMap = StageCursorMap } )}")
@Options(statementType = StatementType.CALLABLE)
@ResultType(State.class)
@Results(id = "StageCursorMap",
        value = {
                @Result(property = "id", column = "state_id"),
                @Result(property = "name", column = "state_name"),
                @Result(property = "code", column = "state_code"),
        })
public void callGetStatesAnnotations(State state);

如果必须传递 IN 参数,请使用

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

然后将参数传递给

public void callGetStatesAnnotations(params)
于 2019-03-22T17:55:53.377 回答
0

/* 你需要做的就是声明你的结果类型见下面的例子*/

@Select(value= "{ CALL getTotalCityStateId()}")
@Options(statementType = StatementType.CALLABLE)
@ResultType(State.class)
@Results(
{   
 @Result(property="id", column="state_id"),
 @Result(property="name", column="state_name"),
 @Result(property="code", column="state_code"),
})
List<State> callGetStatesAnnotations();
于 2016-05-27T19:55:00.050 回答