如何在MyBatis中使用结果集填充参数图

时间:2016-04-04 06:34:12

标签: java mybatis

我正在阅读一本书“MyBatis in Practice”,并且无法理解为什么第67-68页的代码不起作用。这是问题所在。它是关于调用存储过程并且它可以工作,但真正的问题是我无法弄清楚如何使用结果集填充输入映射。所以这是主类的代码:

public void callReadAllPets() throws Exception {
    HashMap<String, List<PetDVO>> inputMap = new HashMap<String, List<PetDVO>>();
    List<PetDVO> petList = new ArrayList<PetDVO>();
    inputMap.put("petData", petList);
    //
    getSqlSession().selectList("callReadAllPets", inputMap);
    List<PetDVO> outputData = inputMap.get("petData");
    printResultList(outputData, "read_all_pets");
}

private void printResultList(List<PetDVO> list) {
    for (PetDVO item : list) {
        System.out.println("     owner: " + item.getOwner());
        System.out.println("   species: " + item.getSpecies());
        System.out.println("       sex: " + item.getSex());
    }
}

PetDVO只是一个Java POJO。 这是mapper.xml中的代码

<select id="callReadAllPets" resultType="PetDVO" statementType="CALLABLE">
 CALL read_all_pets('SELECT name, owner, species, sex, birth, death FROM pet')

运行前面的代码后,outputData列表为空,即未填充结果。这是本书中建议的方式,但它对我不起作用?我怎么解决这个问题? 附: 我正在使用MyBatis 3.2.3

2 个答案:

答案 0 :(得分:0)

好的,如果你想用存储过程的OUT参数填充输入参数,你可以这样做......

<mapper namespace="com.example.SomeMapper">    
    <select id="doSomething" statementType="CALLABLE" parameterType="com.example.SomeRequest">
    { call someProcedure (
        #{someParameter,javaType=Long,jdbcType=NUMERIC,mode=IN},
        #{out,javaType=Long,jdbcType=NUMERIC,mode=OUT})
    }
    </select >
</mapper>

你的com.example.SomeRequest课程看起来像这样......

class SomeRequest {

    private Long someParameter;
    private Long out;

    // add Getters & Setters

}

这应该允许您从SomeRequest.out变量中检索(长)结果。要映射更复杂的结果,您需要将它们定义为ResultSet并提供ResultMap,例如......

#{out,javaType=java.sql.ResultSet,jdbcType=CURSOR,resultMap=someResultMap,mode=OUT}

至少,这就是我们使用Oracle数据库和包函数的方式。希望它也能以同样的方式与MySql存储过程一起工作......

答案 1 :(得分:0)

感谢您的回答,但我正在使用H2。在H2中没有存储过程,只有存储的函数实际上是普通的java方法。在这种情况下,stored函数返回ResultSet并直接使用查询'SELECT name, owner, species, sex, birth, death FROM pet'调用此函数会生成正确的结果。因此,我相信MyBatis知道生成的ResultSet但无法将其放回inputMap中。为了澄清这个问题,我会做两件事。首先,我要检查是否resultMap="petData" will work instead of resultType="PetDVO",因为petData已经是inputMap的参数。如果这不起作用,我将向自己保证MyBatis正在使用前面提到的方法List<PetDVO> outputData = getSqlSession().selectList("callReadAllPets", inputMap)接收结果集。不幸的是,几小时后我就可以试试了。再次感谢@Florian Schaetz。