Mybatisで繰り返しを使用する方法

Mybatisで繰り返しを使用する方法

MyBatisで繰り返し処理を行う方法について説明します。
MyBatisでは、SQLマッピングファイルで繰り返し処理を実装するために、foreachタグを使用します。
以下では、具体的な例を通してこの機能を解説します。

繰り返し処理の基本

MyBatisのforeachタグは、リストや配列などのコレクションを繰り返し処理するために使用します。
特に、複数の値を持つクエリ条件やインサート文で便利です。

例: 複数レコードのインサート

例えば、test_userというテーブルに複数のユーザー情報を一度にインサートするシナリオを考えます。
ユーザー情報のリストを受け取り、それをSQL文で繰り返し処理します。

以下のようなマッパーXMLファイルで、insertUsersというメソッドを定義することができます。
ここで、foreachタグを用いてリスト内の各ユーザーを処理します。

<insert id="insertUsers" parameterType="java.util.List">
  INSERT INTO test_user (user_id, user_name, user_email)
  VALUES
  <foreach collection="list" item="user" separator=",">
    (#{user.userId}, #{user.userName}, #{user.userEmail})
  </foreach>
</insert>

この例では、insertUsersメソッドがリストを受け取り、リスト内の各ユーザーをtest_userテーブルに挿入します。
foreachタグのcollection属性はリストの名前を指定し、item属性はリスト内の各要素を示す変数名を指定します。
separator属性で、各挿入行の間にカンマを挿入しています。

例: 複数条件での検索

別の例として、複数の条件でデータを検索するケースを考えます。
たとえば、test_productテーブルから特定のカテゴリと価格範囲に一致する商品を検索する場合、foreachタグを用いて条件を動的に組み立てることができます。

<select id="findProductsByCategories" parameterType="java.util.Map" resultType="test_product">
  SELECT * FROM test_product
  WHERE category_id IN
  <foreach collection="categories" item="category" open="(" close=")" separator=",">
    #{category}
  </foreach>
  AND price BETWEEN #{minPrice} AND #{maxPrice}
</select>

この例では、findProductsByCategoriesメソッドがcategoriesというリストとminPriceおよびmaxPriceという価格範囲を受け取ります。
foreachタグを使用して、リスト内のカテゴリIDをIN句で条件に加えています。
openとclose属性を使って、IN句の括弧を追加し、separator属性でリスト内の要素をカンマで区切っています。

まとめ

MyBatisのforeachタグは、コレクションを繰り返し処理する際に非常に便利です。
リストや配列の各要素を用いて、動的にSQL文を組み立てることができ、複数のレコードのインサートや複数条件での検索に活用できます。
上記の例では、test_userテーブルとtest_productテーブルを使用して、foreachタグの使い方を示しました。