我想使用spring mvc @modelAttribute在我的Jsp页面中显示类别列表。
在我的mapper.xml文件中是
<select id="selectAllCategories" resultMap="BaseResultMap">
select id, name from categories
</select>
在我的Mapper.java类中,我有一个方法
List<Map<String, String>> selectAllCategories();
我想要一个这样的方法:
Map<Integer, String>`selectAllCategories();
而不是List<Map<>>
,这有可能吗?
发布于 2012-08-11 21:33:46
您希望获得一个Map<Integer,String>
,其中Integer是id
,String是name
。如果您的表中有200个类别,您将需要在地图中包含200个条目,而不是包含200个地图的列表。
MyBatis不能做到开箱即用,但您可以使用它的工具来实现。我看到了两个选择。
选项1:
第一个不完全是你想要的,但值得一看。它为您提供了一个Map<Integer,Category>
,其中Category是categories表的域对象,它具有id、name (可能还有categories表中的其他字段)。在创建了Category域对象之后,在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 ResultHandler接口的类。
您的ResultHandler将使用MyBatis创建的默认哈希表column-name => column-value,并创建一个master 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());
}
}
}
在category表中,每行调用一次handleResult方法。您告诉MyBatis使用ResultHandler,然后像这样提取您的主地图:
CategoryResultHandler rh = new CategoryResultHandler();
session.select("getAllCategories", rh);
Map<Integer,String> m = rh.getIdNameMap();
这两个中的一个应该可以为您工作。
最后要注意的几点:
getFromMap()
帮助器方法?因为在MyBatis返回的哈希图中,您不能总是控制列名的大小写。更多细节在这里:mybatis- 3.1.1. how to override the resultmap returned from mybatishttps://stackoverflow.com/questions/11913013
复制相似问题