【发布时间】:2016-07-23 14:21:27
【问题描述】:
我正在阅读一本书“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 列表为空,即未填充结果。这是书中建议的方式,但它对我不起作用?我该如何解决这个问题? p.s. 我正在使用 MyBatis 3.2.3
【问题讨论】:
-
您的调用语句似乎没有任何名为“petData”的输出参数?
-
嗯...@Florian Schaetz,这听起来很合理,但我现在无法检查它,因为我没有书。这看起来像书中的 lapsus calami,因为似乎正确的答案可能是 resultMap="petData" 而不是 resultType="PetDVO",但我不记得在映射器文件的任何地方看到 petData 映射?我稍后会检查它。谢谢。
-
我还是很困惑,因为您正在执行 resultType,这意味着您希望 callReadAllPets 返回一个值,但您没有从
getSqlSession().selectList(获得返回值。相反,您似乎期望它在参数对象中,实际上没有任何 OUT 参数... -
如果您实际上并不期望从 selectList 中返回某些内容,那么您不需要在映射器中使用 returnType...那么您的语句中的 OUT 参数就足够了。所以我假设你在这里只需要
List<PetDVO> outputData = getSqlSession().selectList("callReadAllPets", inputMap);。 -
是的,我知道我可以通过这种方式解决问题,而且我之前也做过很多次,但我想知道书中给出的解决方案。为什么这不起作用,我怎样才能使它起作用?