mybatis下XML中sql写法

1 循环

通常是 in 查询,循环使用 foreach 标签来实现,根据传参的不同类型分为以下几种。

1.1 List<?>

一般传入列表的基本上是基础类型,比如 String ,当然也可以传 object ,如果你不处理下的话。

List<HosPersonVO> getUserInfos(@Param("personIds")List<String> personIds);

需要注意的点是传参使用的 @Param 就是标签里的 collection ;如果加括号了,就不需要在标签里声明 openclose;标签里的 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 片段。
✅ 如果多个条件可以同时满足,并且都要加入 SQL,使用多个 if 更合适。

3 返回类型

3.1 不想创建对象就用Map

mapper 接口示例:

@SuppressWarnings("MybatisXMapperMethodInspection")
List<Map<String, Object>> getRuleGroupTypeIdAndName(Set<String> ruleGroupTypeIds);

这个地方加这个注解是因为使用了 mybatisX 插件,导致检查报错 @MapKey is required ,但是我们这个地方返回的是列表,不需要指定 key ,加个注解消除报错,属于强迫症了。当然也可以去配置中取消插件的检查,也可以消除报错。

image

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>
posted @ 2025-04-02 16:28  大唐冠军侯  阅读(46)  评论(0)    收藏  举报