1

目前正在从 iBatis 升级到 myBatis。在 ibatis 中我们会有一个这样的 sql map

<resultMap id="PCRV_HIERARCHY_LVL_LIST_MAP" class="com.fmrco.sai.aadpm.domain.ConstraintHierarchyLevel">
    <result property="levelId" column="LEVEL_ID"/>
    <result property="levelDescription" column="LEVEL_DESCRIPTION"/>
    <result property="levelRank" column="LEVEL_RANK"/>
    <result property="levelCode" column="LEVEL_CODE"/>
</resultMap>

<parameterMap id="GET_HIERARCHY_LVL_LIST_MAP" class="java.util.Map">
    <parameter property="PCRV_HIERARCHY_LVL_LIST" jdbcType="ORACLECURSOR" javaType="java.sql.ResultSet" mode="OUT" resultMap="PCRV_HIERARCHY_LVL_LIST_MAP"/>
</parameterMap>


<procedure id="GET_HIERARCHY_LVL_LIST" parameterMap="GET_HIERARCHY_LVL_LIST_MAP">
    { call GET_HIERARCHY_LVL_LIST ( ? ) }
</procedure>

我想充分利用 myBatis 提供的功能(例如不需要实现映射器并避免使用不推荐使用的功能,例如 parameterMap),但我遇到了一些问题。我一直在尝试设置返回属性时遇到错误,所以我不得不将我的 resultSet 对象包装在一个包装器对象中,这是我想避免的

Mapper.java
public void getHierarchyLevels(ListConstraintHierarchyLevel constraintHierarchyLevels);

ConstraintHierarchyLevel 类

public class ListConstraintHierarchyLevel {
    private List<ConstraintHierarchyLevel> constraintHierarchyLevels ;


    public List<ConstraintHierarchyLevel> getConstraintHierarchyLevels() {
        return constraintHierarchyLevels;
    }


    public void setConstraintHierarchyLevels(List<ConstraintHierarchyLevel> constraintHierarchyLevels) {
        this.constraintHierarchyLevels = constraintHierarchyLevels;
    }
}

映射器.xml

<resultMap id="HierarchyLvlMap" type="com.fmrco.sai.aadpm.domain.ConstraintHierarchyLevel">
    <result property="levelId" column="LEVEL_ID"/>
    <result property="levelDescription" column="LEVEL_DESCRIPTION"/>
    <result property="levelRank" column="LEVEL_RANK"/>
    <result property="levelCode" column="LEVEL_CODE"/>
</resultMap>

<select statementType="CALLABLE" 
    id="getHierarchyLevels" 
    parameterType="com.fmrco.sai.aadpm.domain.ListConstraintHierarchyLevel" 
    resultMap="HierarchyLvlMap">
    { call GET_HIERARCHY_LVL_LIST ( 
        #{constraintHierarchyLevels, 
        jdbcType=CURSOR,
        mode=OUT,
        javaType=java.sql.ResultSet,
        resultMap=HierarchyLvlMap}
     ) }
</select>

我尝试了另一种解决方案,但未成功。在这个解决方案中,我使用了 param 注释

映射器.java

public void getHierarchyLevelsWithParam(@Param("constraintHierarchyLevels") List<ConstraintHierarchyLevel> constraintHierarchyLevels); 

我使用与上面相同的 resultMap 但使用不同的选择块

映射器.xml

     <select statementType="CALLABLE" 
    id="getHierarchyLevelsWithParam" 
    parameterType="list" 
    resultMap="HierarchyLvlMap">
    { call GET_HIERARCHY_LVL_LIST ( 
        #{constraintHierarchyLevels, 
        jdbcType=CURSOR,
        mode=OUT,
        javaType=java.sql.ResultSet,
        resultMap=HierarchyLvlMap}
     ) }

运行此程序时,我已将 MapperMethod 类调试到 execute 方法,并且 Object 参数从结果集中获取正确的数据,但是由于这没有放入发送的参数(列表)中,因此不会返回这些值。当使用对象包装器运行第一个方法时,对象被放置在向下发送的参数中,因此是可检索的。

谢谢

4

1 回答 1

1

除了包装结果对象之外,我不知道任何其他方式。事实上, OUT 变量必须绑定在某些东西上,这是一个变量范围问题,那么间接是强制性的。但它可以是通用的:

class Wrapper<T> {
private List<T> member;
}

@Param 注解实际上是用来给参数一个名称以在 SQL 中用作引用(尤其是在映射器方法有多个参数的情况下)

于 2016-10-27T10:12:17.577 回答