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つがあなたのために働くはずです。
いくつかの最終的なメモ:
getFromMap()
ヘルパー メソッドを含めたのはなぜですか? MyBatis が返すハッシュマップの列名の大文字と小文字を常に制御できるとは限らないためです。詳細はこちら: mybatis- 3.1.1. mybatis から返された結果マップをオーバーライドする方法
mybatis-koans の Koan26 にこれらのソリューションの実例があります (あなたの質問に基づいて追加しました): https://github.com/midpeter444/mybatis-koans