你想得到一个Map<Integer,String>
其中整数是id
字符串是name
。如果表中有 200 个类别,则您的地图中需要 200 个条目,而不是包含 200 个地图的列表。
MyBatis 不能直接做到这一点,但您可以使用它的设施来做到这一点。我看到两个选择。
选项1:
第一个不完全符合您的要求,但值得展示。它给你一个Map<Integer,Category>
其中 Category 是类别表的域对象,具有 id、名称(以及类别表中可能的其他字段)。创建类别域对象后,在 MyBatis 中使用以下命令可以很容易地做到这一点:@MapKey
注解:
@Select("SELECT id, name FROM categories")
@MapKey("id")
Map<Integer,Category> getAllCategories();
在您的代码中您将执行以下操作:
MyMapper mapper = session.getMapper(MyMapper.class);
Map<Integer,Category> m = mapper.getAllCategories();
这可能适用于您的用例,也可能不适用于您的用例,具体取决于您是否可以将名称提取为 Category 对象的属性。
选项2:
为了得到Map<Integer,String>
你要求的,我知道的最简单的方法是创建一个实现 MyBatis 的类结果处理器 http://www.mybatis.org/mybatis-3/apidocs/reference/org/apache/ibatis/session/ResultHandler.html界面。
您的 ResultHandler 将使用 MyBatis 创建的默认 hashmap(column-name => column-value)并创建单个主 Map。这是代码:
public class CategoryResultHandler implements ResultHandler {
Map<Integer,String> inMap = new HashMap<Integer,String>();
public Map<Integer, String> getIdNameMap() {
return inMap;
}
@Override
public void handleResult(ResultContext rc) {
@SuppressWarnings("unchecked")
Map<String,Object> m = (Map<String,Object>)rc.getResultObject();
inMap.put((Integer)getFromMap(m, "id"),
(String)getFromMap(m, "name"));
}
// see note at bottom of answer as to why I include this method
private Object getFromMap(Map<String, Object> map, String key) {
if (map.containsKey(key.toLowerCase())) {
return map.get(key.toLowerCase());
} else {
return map.get(key.toUpperCase());
}
}
}
类别表中的每行都会调用一次handleResult 方法。您告诉 MyBatis 使用 ResultHandler,然后像这样提取您的主映射:
CategoryResultHandler rh = new CategoryResultHandler();
session.select("getAllCategories", rh);
Map<Integer,String> m = rh.getIdNameMap();
这两者之一应该适合你。
最后一些注意事项:
为什么我包括getFromMap()
辅助方法?因为你不能总是控制MyBatis返回的hashmap中列名的大小写。更多详细信息请参见此处:mybatis-3.1.1。如何覆盖mybatis返回的resultmap https://stackoverflow.com/questions/11720856/mybatis-3-1-1-how-to-override-the-resultmap-returned-from-mybatis/11732674#11732674
我在 mybatis-koans 的 Koan26 中有这些解决方案的工作示例(我根据您的问题添加了它):https://github.com/midpeter444/mybatis-koans https://github.com/midpeter444/mybatis-koans