动态 SQL 通常要做的事情是有条件地包含 where 子句的一部分,if 在 where 子句中做简单的条件判断。
1 + 叠加1
1 2 3 4 5 6
<selectid="dynamicIfTest"resultType="User"> select * from user where sex = 'male' <iftest="address != null"> and address = #{address} </if> </select>
二选一
1 2 3 4 5 6 7 8 9
<selectid="dynamicIfTest"resultType="User"> select * from user where sex = 'male' <iftest="address != null"> and address = #{address} </if> <iftest="phone != null"> and phone like #{phone} </if> </select>
<selectid="dynamicChooseTest"resultType="User"> select * from user where sex = 'male' <choose> <whentest="username != null"> and username like #{username} </when> <whentest="phone != null"> and phone like #{phone} </when> <otherwise> and address = 'chengdu' </otherwise> </choose> </select>
choose 的用法和 java 的 switch 类似,按照顺序执行,当 when 中有条件满足时,则跳出 choose,所以在 when 和 otherwise 中只会输出一个,当所有 when 的条件都不满足就输出 otherwise 的内容。
在上述的语句中,如果第一个 when 满足,则查询性别为 male,用户名包含所传入内容的用户所有信息,如果第一个不满足,第二个 when 满足,则查询性别为 male,电话包含所传入内容的用户所有信息,如果所有的 when 都不满足,则查询性别为 male,地址为 chengdu 的用户所有信息。
trim
trim 元素可以给自己包含的内容加上前缀(prefix)或加上后缀(suffix),也可以把包含内容的首部(prefixOverrides)或尾部(suffixOverrides)某些内容移除。
1 2 3 4 5 6 7 8 9 10 11
<selectid="dynamicTrimTest"resultType="User"> select * from user <trimprefix="where"prefixOverrides="and |or "> <iftest="address != null"> address = #{address} </if> <iftest="phone != null"> and phone like #{phone} </if> </trim> </select>
单参数且为 List 时,值为 list 单参数且为 array 数组时,值为 array 多参数需封装成一个 Map,map 的 key 就是参数名,collection 属性值是传入的 List 或 array 对象在自己封装的 map 里面的 key
1 2 3 4 5 6 7
<selectid="dynamicForeachTest"resultType="User"> select * from user where id in <foreachitem="item"index="index"collection="list" open="("separator=","close=")"> #{item} </foreach> </select>
在上述语句中,collection 值为 list,因此其对应的 Mapper 中:
1
public List<User> dynamicForeachTest(List<Integer> ids);
2.单参数array数组的类型:
1 2 3 4 5 6
<selectid="dynamicForeach2Test"parameterType="java.util.ArrayList"resultType="Blog"> select * from t_blog where id in <foreachcollection="array"index="index"item="item"open="("separator=","close=")"> #{item} </foreach> </select>
3.自己把参数封装成Map的类型
1 2 3 4 5
<selectid="dynamicForeach3Test"parameterType="java.util.HashMap"resultType="Blog"> select * from t_blog where title like "%"#{title}"%" and id in <foreachcollection="ids"index="index"item="item"open="("separator=","close=")"> #{item} </foreach> </select>
上述collection的值为ids,是传入的参数Map的key,对应的Mapper代码:
public List dynamicForeach3Test(Map params);
对应测试代码:
<selectid="dynamicBindTest"resultType="User"> <bindname="pattern"value="'%' + _parameter.getPhone() + '%'" /> select * from user where phone like #{pattern} </select>