Mybatisで検索条件が複数ある場合の実装方法

Mybatisで検索条件が複数ある場合の実装方法

MyBatisで検索条件が複数ある場合の実装方法を説明します。
以下では、test_entityというエンティティと、test_tableというテーブルを例にして説明します。

1. 基本的な条件の組み合わせ

MyBatisで複数の検索条件を扱うには、条件を動的に組み合わせるためにifやchooseを使います。
たとえば、test_tableから特定の条件でデータを取得する場合を考えます。

以下の例では、nameとageの2つの条件でデータを検索するクエリを作成します。

1.1. ifを使った条件の追加

条件が複数ある場合、ifを使って検索条件を動的に追加できます。
例えば、test_entityのnameが指定されている場合にのみ、nameによる検索を行い、ageが指定されている場合にはageによる検索も行います。

<select id="findByConditions" parameterType="map" resultType="test_entity">
    SELECT * FROM test_table
    WHERE 1=1
    <if test="name != null">
        AND name = #{name}
    </if>
    <if test="age != null">
        AND age = #{age}
    </if>
</select>

この例では、nameとageのいずれかが指定されていれば、それに応じてSQLのWHERE句に条件が追加されます。

1.2. chooseを使った条件の選択

chooseを使用すると、複数の条件の中から1つを選択することができます。
たとえば、test_tableからstatusによる検索を行い、statusがactiveの場合とinactiveの場合で処理を分けたい場合に利用します。

<select id="findByStatus" parameterType="map" resultType="test_entity">
    SELECT * FROM test_table
    WHERE 1=1
    <choose>
        <when test="status == 'active'">
            AND status = 'active'
        </when>
        <when test="status == 'inactive'">
            AND status = 'inactive'
        </when>
        <otherwise>
            AND status IS NULL
        </otherwise>
    </choose>
</select>

このように、chooseを使うことで、複数の条件の中から1つを選択することができます。

2. 複数条件の組み合わせ

複数の条件を組み合わせる場合、条件が指定されているかどうかに応じて、ifやchooseを組み合わせることができます。

2.1. 複数のifを組み合わせる

複数の条件を組み合わせて検索する場合、条件ごとにifを使い、必要に応じて追加の条件を加えることができます。

<select id="findByMultipleConditions" parameterType="map" resultType="test_entity">
    SELECT * FROM test_table
    WHERE 1=1
    <if test="name != null">
        AND name = #{name}
    </if>
    <if test="age != null">
        AND age = #{age}
    </if>
    <if test="status != null">
        AND status = #{status}
    </if>
</select>

この例では、name、age、statusのいずれかが指定されている場合に、それに応じて検索条件が追加されます。

2.2. chooseとifの組み合わせ

chooseとifを組み合わせることで、より複雑な条件ロジックを構築することができます。
たとえば、ageが指定されている場合に加え、statusがactiveかinactiveかで処理を分ける場合です。

<select id="findByComplexConditions" parameterType="map" resultType="test_entity">
    SELECT * FROM test_table
    WHERE 1=1
    <if test="age != null">
        AND age = #{age}
        <choose>
            <when test="status == 'active'">
                AND status = 'active'
            </when>
            <when test="status == 'inactive'">
                AND status = 'inactive'
            </when>
            <otherwise>
                AND status IS NULL
            </otherwise>
        </choose>
    </if>
</select>

このように、chooseとifを組み合わせることで、より細かい条件に対応できます。

3. 条件の順序とパフォーマンス

複数の条件を使用する際は、条件の順序やSQLのパフォーマンスも考慮する必要があります。
ifを使って動的に条件を追加することで、実行時に最適なSQLが生成されるため、パフォーマンスの最適化が可能です。

3.1. SQLのパフォーマンス

複数の条件を使用する場合、条件が多くなるほどSQLが複雑になるため、パフォーマンスに影響を与える可能性があります。
条件を適切に組み合わせ、必要なインデックスを追加することで、パフォーマンスを改善することができます。

3.2. クエリの可読性

複雑な条件を含むクエリは、可読性が低くなることがあります。
条件を整理し、適切にifやchooseを使うことで、クエリの可読性を保ちながら、複数の条件を効果的に管理することができます。

このように、MyBatisで複数の検索条件を扱う方法には、ifやchooseを活用することで、動的に条件を追加したり、複雑な条件ロジックを構築したりすることができます。