Mybatisでwhenとtestを使用した実装

Mybatisでwhenとtestを使用した実装

MyBatisにおけるwhenとtestを使用した実装について、具体的な例を交えて解説します。
ここでは、test_userテーブルを用いて、条件に応じて異なるSQLクエリを生成する方法を説明します。

前提

以下の条件を満たすtest_userテーブルがあると仮定します:

  • テーブル名: test_user
  • カラム:

- id (INT, 主キー)
- name (VARCHAR)
- age (INT)
- email (VARCHAR)

MyBatisのXMLマッパー設定

まず、MyBatisのXMLマッパーにおいて、whenおよびtestを使用して条件付きクエリを作成します。

<mapper namespace="com.example.mapper.UserMapper">

    <!-- ユーザー情報を条件に応じて検索するSQL -->
    <select id="findUserByConditions" parameterType="map" resultType="com.example.model.User">
        SELECT * FROM test_user
        WHERE 1=1
        <if test="name != null">
            AND name = #{name}
        </if>
        <if test="age != null">
            AND age = #{age}
        </if>
        <if test="email != null">
            AND email = #{email}
        </if>
    </select>

</mapper>
SQLクエリの解説
  • findUserByConditionsというIDのselectタグを定義しています。
  • parameterTypeにはmapを指定し、複数の条件を渡せるようにしています。
  • resultTypeにはUserクラスを指定し、クエリの結果をマッピングします。
  • WHERE 1=1は、動的に追加される条件を簡潔に管理するためのテクニックです。
  • ifタグを使用して、name、age、emailの各条件が存在する場合にのみ、対応するSQL条件を追加します。
MyBatisのMapperインターフェース

次に、XMLマッパーに対応するMapperインターフェースを定義します。

package com.example.mapper;

import com.example.model.User;
import java.util.Map;
import java.util.List;

public interface UserMapper {

    List<User> findUserByConditions(Map<String, Object> params);

}
Javaコードでの使用例

マッパーを使って条件付きクエリを呼び出す例を示します。

import com.example.mapper.UserMapper;
import com.example.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class UserService {

    @Autowired
    private UserMapper userMapper;

    public List<User> searchUsers(String name, Integer age, String email) {
        Map<String, Object> params = new HashMap<>();
        if (name != null) params.put("name", name);
        if (age != null) params.put("age", age);
        if (email != null) params.put("email", email);

        return userMapper.findUserByConditions(params);
    }
}
実装のポイント
  • searchUsersメソッドでは、条件に応じてparamsマップに値を追加し、userMapperのfindUserByConditionsメソッドを呼び出します。
  • paramsマップには、クエリの条件となる値が格納されており、findUserByConditionsメソッドでこれらの値がSQLに反映されます。
  • findUserByConditionsメソッドでは、ifタグを使って動的にSQLの条件部分が構築されます。

このように、MyBatisのwhenやtestタグを利用することで、柔軟で再利用可能なSQLクエリを構築することができます。