広告 Java

MyBatisでif文(条件分岐)を使用して動的SQLを生成する

2022年7月26日

MyBatisで条件分岐を実装する

ifで条件分岐

MyBatisで「if test」を使えば、「もし~だったら」という条件文が書けます。

次の例で、もし「idがnull以外」の場合「AND id = #{id}」の条件をWHERE句に追加するという条件分岐を作成しています。

<select id="search" resultType="com.example.demo.entity.UserInfo">
    SELECT
        *
    FROM
        userinfo
    WHERE
        delete_date IS NULL
        <if test="id != null">
            AND id = #{id}
        </if>
</select>

また「and」や「or」で条件を複数書くこともできます。

次の例では、もし「idがnull以外 かつ 空文字以外」の場合「AND id = #{id}」の条件をWHERE句に追加するという条件分岐を作成しています。

<select id="search" resultType="com.example.demo.entity.UserInfo">
    SELECT
        *
    FROM
        userinfo
    WHERE
        delete_date IS NULL
        <if test="id != null and id != ''">
            AND id = #{id}
        </if>
        <if test="name != null and name != ''">
            AND name = #{name}
        </if>
</select>

スポンサーリンク

chooseで条件分岐

MyBatisで「if-else if-else」のような条件分岐を作成するときは、「choose-when-otherwise」を使用します。

「choose-when-otherwise」の書き方は、次のとおりです。

  • <choose>~</choose>で囲む。
  • <when>~</when>に条件を書く(whenは複数作成可能)、これが「if」や「else if」と同じ意味。
  • <otherwise>~</otherwise>に<when>の条件に一致しなかった時の処理を書く(otherwiseは書かなくてもよい)、これが「else」と同じ意味。

次のSQLは「choose-when-otherwise」の使用例です。

<select id="search" resultType="com.example.demo.entity.UserInfo">
    SELECT
        *
    FROM
        userinfo
    WHERE
        delete_date IS NULL
        <choose>
            <when test="id != null and id != ''">
                AND id = #{id}
            </when>
            <when test="name != null and name != ''">
                AND name = #{name}
            </when>
            <otherwise>
                AND id = '1'
            </otherwise>
        </choose>
</select>

上記例では、下記1~3のいずれかをWHERE句に追加するという条件分岐を作成しています。

  1. <when test="id != null and id != ''">の条件に一致 → 「AND id = #{id}」の条件をWHERE句に追加。
  2. 上記が一致しない場合 → <when test="name != null and name != ''">の条件に一致したら、「AND name = #{name}」の条件をWHERE句に追加。
  3. 上記のいずれにも一致しない場合 → 「AND id = '1'」の条件をWHERE句に追加。

helpful