我正在阅读一本书“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
答案 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。