Mybatisで条件分岐を実装する方法

Mybatisで条件分岐を実装する方法

MyBatisでの条件分岐の実装

MyBatisでは、動的SQLを使って条件分岐を実装できます。
以下に、test_userというテーブルとtestUserMapperというマッパークラスを例にして、条件分岐の使い方を紹介します。

1. ifを使った条件分岐

ifを使用して、SQLに条件を追加できます。
例えば、ユーザーが有効な場合のみデータを取得するSQLは以下のように書けます。

<mapper namespace="com.example.testUserMapper">
    <select id="selectActiveUsers" resultType="TestUser">
        SELECT * FROM test_user
        WHERE 1=1
        <if test="status != null">
            AND status = #{status}
        </if>
    </select>
</mapper>

この場合、statusがnullでない場合のみ、AND status = *{status}という条件がSQLに追加されます。

2. chooseを使った条件分岐

chooseは、whenとotherwiseを使って複数の条件の中から最初に満たされたものを選択します。

<mapper namespace="com.example.testUserMapper">
    <select id="selectUsersByCondition" resultType="TestUser">
        SELECT * FROM test_user
        WHERE 1=1
        <choose>
            <when test="status != null">
                AND status = #{status}
            </when>
            <when test="age != null">
                AND age = #{age}
            </when>
            <otherwise>
                AND created_at >= NOW()
            </otherwise>
        </choose>
    </select>
</mapper>

ここでは、statusがnullでなければその条件が使われ、次にageがnullでなければその条件が使われます。
どちらの条件も満たされない場合は、otherwiseの条件が使われます。

3. whereを使った条件分岐

whereを使うと、動的なWHERE句を生成し、適切にANDやORを自動で追加してくれます。

<mapper namespace="com.example.testUserMapper">
    <select id="selectUsersDynamicWhere" resultType="TestUser">
        SELECT * FROM test_user
        <where>
            <if test="status != null">
                AND status = #{status}
            </if>
            <if test="age != null">
                AND age = #{age}
            </if>
        </where>
    </select>
</mapper>

この例では、statusやageが指定されている場合にのみ、対応する条件がSQLに含まれます。

まとめ

MyBatisの条件分岐を使うことで、柔軟で効率的なSQLクエリを実行できます。
ifやchoose、whereを適切に使い分けることで、様々な条件に対応するSQLを構築できます。