Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在mybatis中返回HashMap,并将其用作SpringMVC中的ModelAttribute_Java_Spring Mvc_Mybatis_Ibatis - Fatal编程技术网

Java 在mybatis中返回HashMap,并将其用作SpringMVC中的ModelAttribute

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>&

我想使用SpringMVC@modelAttribute在我的Jsp页面中显示类别列表

在我的mapper.xml文件中

<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中列名的大小写。详情如下:

  • 我在mybatis koans的Koan26中有这些解决方案的工作示例(我根据您的问题添加了这些示例):


  • 嗨,彼得,谢谢你的回复。是的,你是对的,它的退货清单。但我希望返回类型为Map而不是List,这可能吗?很抱歉出现任何混淆。选项1:
    SqlSession.selectMap(String语句,String映射键)
    请查看此处: