Mybatisで引数がMapの場合の実装
MyBatisで引数としてMapを使用する場合、SQLマッピングを柔軟に扱うことができます。
Mapを引数にすると、動的にクエリの条件を変えたり、複数の値を一度に渡したりするのが簡単になります。
以下に、Mapを使用したMyBatisの実装例を示します。
1. 基本的なマッピング
例えば、Userというテーブルから特定のユーザー情報を取得する場合を考えます。
ここでは、idとnameをMapで渡し、条件に応じてクエリを実行します。
Mapperインターフェースの定義
public interface UserMapper { User selectUserByConditions(Map<String, Object> params); }
Mapper XMLの定義
UserMapper.xmlファイルに以下のように定義します。
ここでは、Mapからidとnameを取り出し、WHERE句の条件として使用しています。
<select id="selectUserByConditions" parameterType="map" resultType="User"> SELECT * FROM User WHERE 1=1 <if test="id != null"> AND id = #{id} </if> <if test="name != null"> AND name = #{name} </if> </select>
2. 条件による動的なクエリ
Mapを使用すると、条件に応じて動的にクエリを変更することができます。
以下の例では、複数の条件をMapで受け取り、どの条件が指定されているかによってクエリを変えています。
Mapperインターフェースの定義
public interface ProductMapper { List<Product> searchProducts(Map<String, Object> params); }
Mapper XMLの定義
ProductMapper.xmlファイルに以下のように定義します。
ここでは、Mapの内容に応じてWHERE句を動的に構築しています。
<select id="searchProducts" parameterType="map" resultType="Product"> SELECT * FROM Product <where> <if test="name != null and name != ''"> AND name LIKE CONCAT('%', #{name}, '%') </if> <if test="category != null"> AND category = #{category} </if> <if test="minPrice != null"> AND price >= #{minPrice} </if> <if test="maxPrice != null"> AND price <= #{maxPrice} </if> </where> </select>
3. 複雑な条件とchooseタグの利用
複数の条件がある場合にchooseタグを利用することで、複雑な条件分岐を実装できます。
以下の例では、Userテーブルからの検索条件をMapで受け取り、chooseタグで条件を分岐させています。
Mapperインターフェースの定義
public interface OrderMapper { List<Order> findOrders(Map<String, Object> params); }
Mapper XMLの定義
OrderMapper.xmlファイルに以下のように定義します。
ここでは、chooseタグを使って条件に応じたクエリを実行しています。
<select id="findOrders" parameterType="map" resultType="Order"> SELECT * FROM Order <where> <choose> <when test="status != null"> AND status = #{status} </when> <when test="dateRange != null"> AND order_date BETWEEN #{dateRange.start} AND #{dateRange.end} </when> <otherwise> <-- Default condition or empty condition --> </otherwise> </choose> </where> </select>
このように、Mapを引数として使用することで、動的なSQLの構築や複雑な条件分岐が容易になります。
Mapに複数のパラメータを格納し、必要な条件を柔軟に処理することができるため、MyBatisの強力な機能を活用することができます。