28

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<>>、それは可能ですか?

4

1 に答える 1

47

Map<Integer,String>整数が でidあり、文字列がであるを取得しnameます。テーブルに 200 のカテゴリがある場合、200 のマップのリストではなく、マップに 200 のエントリが必要になります。

MyBatis はそれをすぐに行うことはできませんが、その機能を使用してそれを行うことができます。2 つの選択肢があります。

オプション1:

最初のものはあなたが求めたものとはまったく異なりますが、示す価値があります。Category は、id、name (および場合によっては、category テーブルの他のフィールド) を持つMap<Integer,Category>、category テーブルのドメイン オブジェクトです。カテゴリ ドメイン オブジェクトを作成したら、@MapKeyアノテーションを使用して MyBatis でこれを行うのは非常に簡単です。

@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 のデフォルトのハッシュマップを使用して、単一のマスター 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());
    }
  }
}

handleResult メソッドは、カテゴリ テーブルの行ごとに 1 回呼び出されます。MyBatis に ResultHandler を使用するように指示し、次のようにマスター マップを抽出します。

CategoryResultHandler rh = new CategoryResultHandler();
session.select("getAllCategories", rh);
Map<Integer,String> m = rh.getIdNameMap();

これら2つのうちの1つがあなたのために働くはずです。

いくつかの最終的なメモ:

  1. getFromMap()ヘルパー メソッドを含めたのはなぜですか? MyBatis が返すハッシュマップの列名の大文字と小文字を常に制御できるとは限らないためです。詳細はこちら: mybatis- 3.1.1. mybatis から返された結果マップをオーバーライドする方法

  2. mybatis-koans の Koan26 にこれらのソリューションの実例があります (あなたの質問に基づいて追加しました): https://github.com/midpeter444/mybatis-koans

于 2012-08-11T13:33:45.770 に答える