Java

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

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」の書き方は、次のとおりです。

  1. <choose>~</choose>で囲む
  2. <when>~</when>に条件を書く(whenは複数作成可能)、これが「if」や「else if」と同じ意味
  3. <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句に追加