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クエリを構築することができます。