返回的HashMap中的MyBatis和Spring MVC中使用它的ModelAttribute(

2019-06-17 17:07发布

我想显示在使用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<>> ,这可能吗?

Answer 1:

你想获得一个Map<Integer,String>其中整数是id并将该字符串的name 。 如果有200类在你的餐桌,你想200项在您的地图,而不是200点的地图列表。

MyBatis的不能完全做到开箱即用,但可以使用其设施来做到这一点。 我看到两个选项。

选项1:

第一个是不是你要求很什么,但是是值得炫耀的。 它给你一个Map<Integer,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();

这可能或可能不适合你的使用情况取决于你是否是否可以提取名称作为分类对象的属性工作。


选项2:

为了让Map<Integer,String>你问,我知道最简单的方法是创建一个实现的MyBatis类ResultHandler接口。

你ResultHandler将使用列名的MyBatis创建=>列值的默认HashMap和建立一个单一的主地图。 下面的代码:

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();

其中这两个应该为你工作。

最后几点注意事项:

  1. 为什么我包括getFromMap()的辅助方法? 因为你不能总是控制在MyBatis的回报HashMap中的列名的情况。 更多细节在这里: mybatis- 3.1.1。 如何覆盖从MyBatis的返回结果映射

  2. 我有工作这些解决方案的实例中的MyBatis-koans的Koan26(我增加了一个基于对您的问题): https://github.com/midpeter444/mybatis-koans



文章来源: Return HashMap in mybatis and use it as ModelAttribute in spring MVC