Posted at

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

More than 3 years have passed since last update.

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)}


サンプルソース

https://github.com/gillax/mybatis-boot-sample/tree/0.1