LoginSignup
11
13

More than 5 years have passed since last update.

MyBatisの@MapKeyを使ってListをMapとして取得する

Posted at

MyBatisでSQL結果をListで取得するのはとても簡単で、Mapperを使う場合だったら下記のように書けます。

PersonMapper.java
public interface PersonMapper {
    @Select("SELECT * FROM people")
    List<Person> findAll();
}

でも、場合によってはListじゃなくて、例えばIDなどをキーとしたMapで取得したいこともあると思います。

Streamを使うと、Listで取得した結果からIDをキーとしたMapを作ることができます。

Map<Integer, Person> resultMap = personMapper.findAll().stream()
    .collect(Collectors.toMap(Person::getId, v -> v));

これはこれで、「Java8 Stream使ってる俺カッコいい感」感じますけど、ちょっとめんどくさいです。

MyBatisには@MapKeyアノテーションがあって、上記でやったことを簡単に実現できます。

PersonMapper.java
public interface PersonMapper {
    @Select("SELECT * FROM people")
    List<Person> findAll();

    @MapKey("id")
    @Select("SELECT * FROM people")
    Map<Integer, Person> findAllMap();
}

アノテーションのvalueにはMapのキーとしたいカラム名を設定します。

Mapperのそれぞれのメソッドの結果を出力すると以下になりました。

findAll => [Person(id=1, name=Bob, country=USA), Person(id=2, name=Taro, country=Japan), Person(id=3, name=Zidane, country=France)]
findAllMap => {1=Person(id=1, name=Bob, country=USA), 2=Person(id=2, name=Taro, country=Japan), 3=Person(id=3, name=Zidane, country=France)}

サンプルソース

11
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
13