Mybatisで引数がMapの場合の実装

Mybatisで引数がMapの場合の実装

MyBatisで引数としてMapを使用する場合、SQLマッピングを柔軟に扱うことができます。
Mapを引数にすると、動的にクエリの条件を変えたり、複数の値を一度に渡したりするのが簡単になります。
以下に、Mapを使用したMyBatisの実装例を示します。

1. 基本的なマッピング

例えば、Userというテーブルから特定のユーザー情報を取得する場合を考えます。
ここでは、idとnameをMapで渡し、条件に応じてクエリを実行します。

Mapperインターフェースの定義

public interface UserMapper {
    User selectUserByConditions(Map<String, Object> params);
}

Mapper XMLの定義

UserMapper.xmlファイルに以下のように定義します。
ここでは、Mapからidとnameを取り出し、WHERE句の条件として使用しています。

<select id="selectUserByConditions" parameterType="map" resultType="User">
    SELECT * FROM User
    WHERE 1=1
    <if test="id != null">
        AND id = #{id}
    </if>
    <if test="name != null">
        AND name = #{name}
    </if>
</select>
2. 条件による動的なクエリ

Mapを使用すると、条件に応じて動的にクエリを変更することができます。
以下の例では、複数の条件をMapで受け取り、どの条件が指定されているかによってクエリを変えています。

Mapperインターフェースの定義

public interface ProductMapper {
    List<Product> searchProducts(Map<String, Object> params);
}

Mapper XMLの定義

ProductMapper.xmlファイルに以下のように定義します。
ここでは、Mapの内容に応じてWHERE句を動的に構築しています。

<select id="searchProducts" parameterType="map" resultType="Product">
    SELECT * FROM Product
    <where>
        <if test="name != null and name != ''">
            AND name LIKE CONCAT('%', #{name}, '%')
        </if>
        <if test="category != null">
            AND category = #{category}
        </if>
        <if test="minPrice != null">
            AND price >= #{minPrice}
        </if>
        <if test="maxPrice != null">
            AND price <= #{maxPrice}
        </if>
    </where>
</select>
3. 複雑な条件とchooseタグの利用

複数の条件がある場合にchooseタグを利用することで、複雑な条件分岐を実装できます。
以下の例では、Userテーブルからの検索条件をMapで受け取り、chooseタグで条件を分岐させています。

Mapperインターフェースの定義

public interface OrderMapper {
    List<Order> findOrders(Map<String, Object> params);
}

Mapper XMLの定義

OrderMapper.xmlファイルに以下のように定義します。
ここでは、chooseタグを使って条件に応じたクエリを実行しています。

<select id="findOrders" parameterType="map" resultType="Order">
    SELECT * FROM Order
    <where>
        <choose>
            <when test="status != null">
                AND status = #{status}
            </when>
            <when test="dateRange != null">
                AND order_date BETWEEN #{dateRange.start} AND #{dateRange.end}
            </when>
            <otherwise>
                <-- Default condition or empty condition -->
            </otherwise>
        </choose>
    </where>
</select>

このように、Mapを引数として使用することで、動的なSQLの構築や複雑な条件分岐が容易になります。
Mapに複数のパラメータを格納し、必要な条件を柔軟に処理することができるため、MyBatisの強力な機能を活用することができます。