mybatis下XML中sql写法
1 循环
通常是 in 查询,循环使用 foreach 标签来实现,根据传参的不同类型分为以下几种。
1.1 List<?>
一般传入列表的基本上是基础类型,比如 String ,当然也可以传 object ,如果你不处理下的话。
List<HosPersonVO> getUserInfos(@Param("personIds")List<String> personIds);
需要注意的点是传参使用的 @Param 就是标签里的 collection ;如果加括号了,就不需要在标签里声明 open 和 close;标签里的 item 随便定义保持一致就好
<if test="personIds != null and personIds.size() > 0">
AND hp.id in
<foreach collection="personIds" item="personId" open="(" separator="," close=")">
#{personId}
</foreach>
</if>
1.2 object.list
对象中包含 List<?> 字段,只需要注意下 collection 的写法就行。
<foreach collection="query.userIdList" item="userId" open="(" separator="," close=")">
#{userId}
</foreach>
2 判断逻辑
主要场景是要某个字段的多个值对应不同的 sql ,使用 choose-when-otherwise 来实现。
<choose>
<when test="query.orderPerType!=null and query.orderPerType ==7">
and t1.STATUS =0
</when>
<otherwise>
and t1.STATUS =1
</otherwise>
</choose>
虽然 if 也可以实现类似的功能,但 choose 更适用于 需要互斥逻辑的场景,且可以避免冗余的 if 判断,让 SQL 更简洁明了。
✅ 如果多个条件是互斥的,推荐使用
✅ 如果多个条件可以同时满足,并且都要加入 SQL,使用多个 if 更合适。
3 返回类型
3.1 不想创建对象就用Map
mapper 接口示例:
@SuppressWarnings("MybatisXMapperMethodInspection")
List<Map<String, Object>> getRuleGroupTypeIdAndName(Set<String> ruleGroupTypeIds);
这个地方加这个注解是因为使用了 mybatisX 插件,导致检查报错 @MapKey is required ,但是我们这个地方返回的是列表,不需要指定 key ,加个注解消除报错,属于强迫症了。当然也可以去配置中取消插件的检查,也可以消除报错。

XML 示例:
<select id="getRuleGroupTypeIdAndName" resultType="java.util.Map">
select
id as groupTypeId,
warning_type_desc as groupTypeName
from t_sys_warning_type_manage
<where>
id in
<foreach item="item" collection="ruleGroupTypeIds" separator="," close=")" open="(" index="index">
#{item}
</foreach>
</where>
</select>

浙公网安备 33010602011771号