Java 在mybatis中返回HashMap,并将其用作SpringMVC中的ModelAttribute
我想使用SpringMVC@modelAttribute在我的Jsp页面中显示类别列表 在我的mapper.xml文件中Java 在mybatis中返回HashMap,并将其用作SpringMVC中的ModelAttribute,java,spring-mvc,mybatis,ibatis,Java,Spring Mvc,Mybatis,Ibatis,我想使用SpringMVC@modelAttribute在我的Jsp页面中显示类别列表 在我的mapper.xml文件中 <select id="selectAllCategories" resultMap="BaseResultMap"> select id, name from categories </select> 从类别中选择id、名称 在我的Mapper.java类中,我有一个 List<Map<String, String>&
<select id="selectAllCategories" resultMap="BaseResultMap">
select id, name from categories
</select>
从类别中选择id、名称
在我的Mapper.java类中,我有一个
List<Map<String, String>> selectAllCategories();
列出selectAllCategories();
我想要一个这样的方法:
Map<Integer, String>`selectAllCategories();
CategoryResultHandler rh = new CategoryResultHandler();
session.select("getAllCategories", rh);
Map<Integer,String> m = rh.getIdNameMap();
Map`selectAllCategories();
可以不使用
列表
,而是使用映射
,其中整数是id
,字符串是名称
。如果表中有200个类别,则您希望地图中有200个条目,而不是200个地图的列表
迈巴蒂斯不能完全做到开箱即用,但你可以利用它的设施做到这一点。我看到两种选择
选项1:
第一个不是你想要的,但值得展示。它为您提供了一个映射
,其中Category是categories表的域对象,该表具有id、name(可能还有categories表中的其他字段)。创建类别域对象后,在MyBatis中使用@MapKey
注释很容易做到这一点:
@Select("SELECT id, name FROM categories")
@MapKey("id")
Map<Integer,Category> getAllCategories();
@Select(“从类别中选择id、名称”)
@映射键(“id”)
映射getAllCategories();
然后在代码中执行以下操作:
MyMapper mapper = session.getMapper(MyMapper.class);
Map<Integer,Category> m = mapper.getAllCategories();
MyMapper-mapper=session.getMapper(MyMapper.class);
Map m=mapper.getAllCategories();
这可能适用于您的用例,也可能不适用于您的用例,这取决于您是否可以将名称提取为类别对象的属性
选项2: 要获得您要求的
Map
,我知道的最简单的方法是创建一个实现MyBatis接口的类
您的ResultHandler将使用MyBatis创建的默认哈希映射column name=>column value并创建一个主映射。代码如下:
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());
}
}
}
公共类CategoryResultHandler实现ResultHandler{
Map inMap=newhashmap();
公共映射getIdNameMap(){
返回inMap;
}
@凌驾
public void handleResult(ResultContext rc){
@抑制警告(“未选中”)
Map m=(Map)rc.getResultObject();
inMap.put((整数)getFromMap(m,“id”),
(字符串)getFromMap(m,“name”);
}
//请参阅答案底部的注释,了解我为什么使用此方法
私有对象getFromMap(映射映射,字符串键){
if(map.containsKey(key.toLowerCase()){
返回map.get(key.toLowerCase());
}否则{
返回map.get(key.toUpperCase());
}
}
}
在category表中,每行调用一次handleResult方法。您告诉MyBatis使用ResultHandler,然后按如下方式提取主地图:
Map<Integer, String>`selectAllCategories();
CategoryResultHandler rh = new CategoryResultHandler();
session.select("getAllCategories", rh);
Map<Integer,String> m = rh.getIdNameMap();
CategoryResultHandler rh=new CategoryResultHandler();
选择(“getAllCategories”,右侧);
Map m=rh.getIdNameMap();
其中一个应该适合你
最后几点注意事项:
getFromMap()
helper方法?因为您不能始终控制MyBatis返回的hashmap中列名的大小写。详情如下:嗨,彼得,谢谢你的回复。是的,你是对的,它的退货清单。但我希望返回类型为Map而不是List,这可能吗?很抱歉出现任何混淆。选项1:
SqlSession.selectMap(String语句,String映射键)
请查看此处: