目前正致力于从iBatis升级到myBatis。在ibatis中我们会有一个像这样的SQL地图
<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;
}
}
mapper.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注释
mapper.java
public void getHierarchyLevelsWithParam(@Param("constraintHierarchyLevels") List<ConstraintHierarchyLevel> constraintHierarchyLevels);
我使用与上面相同的resultMap,但使用不同的选择块
mapper.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 param从结果集中获取了正确的数据,但是因为这不会被放入发送的参数(List)中,所以这些值不会被返回。当使用对象包装器运行第一个方法时,对象被放置在发送的参数中,因此可以检索。
由于
答案 0 :(得分:1)
除了包装结果对象之外,我不知道任何其他方式。 实际上,OUT变量必须绑定一些东西,这是一个变量范围问题,然后间接是强制性的。但它可以是通用的:
class Wrapper<T> {
private List<T> member;
}
@Param注释实际上用于为参数提供一个名称以用作SQL中的引用(特别是如果mapper方法有多个参数)