MyBatisにおけるクエリ結果の取得方法

MyBatisの型エイリアス

定義済みエイリアスは大文字小文字を区別しません

クエリ結果の取得パターン

単一レコード取得時:

  • エンティティオブジェクトで受信
  • Listコレクションで受信
  • Mapオブジェクトで受信

複数レコード取得時:

  • Listコレクションで受信
  • List<Map<String, Object>>で受信
  • @MapKeyアノテーションでキー指定

エンティティオブジェクトによる単一レコード取得

結果が1件の場合のみ有効。複数件取得時はTooManyResultsExceptionが発生

User fetchSingleUser(@Param("userId") Integer userId);
<select id="fetchSingleUser" resultType="User">
  SELECT * FROM user_table WHERE user_id = #{userId}
</select>

Listコレクションによるレコード取得

単一/複数件の両方で利用可能

List<User> fetchAllUsers();
<select id="fetchAllUsers" resultType="User">
  SELECT * FROM user_table
</select>

単一カラム値の取得

MyBatis組み込みエイリアスを使用

Long countUsers();
<select id="countUsers" resultType="java.lang.Long">
  SELECT COUNT(*) FROM user_table
</select>

単一レコードのMap取得

結果形式: {カラム名=値, ...}

Map<String, Object> fetchUserAsMap(@Param("userId") Integer userId);
<select id="fetchUserAsMap" resultType="java.util.HashMap">
  SELECT * FROM user_table WHERE user_id = #{userId}
</select>

複数レコードの取得方法

Mapリストによる取得

List<Map<String, Object>> fetchAllAsMapList();
<select id="fetchAllAsMapList" resultType="java.util.HashMap">
  SELECT * FROM user_table
</select>

@MapKeyアノテーションの適用

一意のフィールドをキーに各レコードをMap値として取得

@MapKey("userId")
Map<Integer, Object> fetchAllUsersMapped();
<select id="fetchAllUsersMapped" resultType="java.util.HashMap">
  SELECT * FROM user_table
</select>

タグ: MyBatis SQLマッピング データ取得 ORM Java永続化

7月11日 18:14 投稿