首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在mybatis中返回HashMap,并将其用作spring MVC中的ModelAttribute

在mybatis中返回HashMap,并将其用作spring MVC中的ModelAttribute
EN

Stack Overflow用户
提问于 2012-08-11 15:49:48
回答 1查看 55.9K关注 0票数 28

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

在我的mapper.xml文件中是

代码语言:javascript
运行
复制
<select id="selectAllCategories" resultMap="BaseResultMap">
  select id, name from categories  
</select>

在我的Mapper.java类中,我有一个方法

代码语言:javascript
运行
复制
List<Map<String, String>> selectAllCategories();

我想要一个这样的方法:

代码语言:javascript
运行
复制
Map<Integer, String>`selectAllCategories();

而不是List<Map<>>,这有可能吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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注释就可以很容易地做到这一点:

代码语言:javascript
运行
复制
@Select("SELECT id, name FROM categories")
@MapKey("id")
Map<Integer,Category> getAllCategories();

在您的代码中,您将执行以下操作:

代码语言:javascript
运行
复制
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。代码如下:

代码语言:javascript
运行
复制
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,然后像这样提取您的主地图:

代码语言:javascript
运行
复制
CategoryResultHandler rh = new CategoryResultHandler();
session.select("getAllCategories", rh);
Map<Integer,String> m = rh.getIdNameMap();

这两个中的一个应该可以为您工作。

最后要注意的几点:

  1. 我为什么要包含getFromMap()帮助器方法?因为在MyBatis返回的哈希图中,您不能总是控制列名的大小写。更多细节在这里:mybatis- 3.1.1. how to override the resultmap returned from mybatis
  2. I在mybatis-koan的Koan26中有这些解决方案的工作示例(我根据您的问题添加的):https://github.com/midpeter444/mybatis-koans
票数 45
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11913013

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档