choose-when-otherwise 分支
<choose> 标签结合 <when> 和 <otherwise> 实现多分支条件选择,类似 Java 的 switch-case-default 结构,按优先级匹配,仅执行第一个为 true 的分支。
基本语法
XML
<choose>
<when test="条件1">分支1</when>
<when test="条件2">分支2</when>
<otherwise>默认分支</otherwise>
</choose>
按顺序判断 when,命中第一个后停止,不继续匹配。
排序字段选择
根据传入参数选择不同排序方式:
XML
<select id="findUser" resultType="User">
SELECT * FROM user
<where>
<if test="status != null">status = #{status}</if>
</where>
<choose>
<when test="sortBy == 'age'">ORDER BY age</when>
<when test="sortBy == 'name'">ORDER BY name</when>
<when test="sortBy == 'date'">ORDER BY create_time</when>
<otherwise>ORDER BY id</otherwise>
</choose>
</select>
传入 sortBy='age' 时,仅执行 ORDER BY age,后续 when 不判断。
搜索条件优先级
多字段搜索,按优先级匹配:
XML
<select id="searchUser" resultType="User">
SELECT * FROM user
<where>
<choose>
<when test="id != null">id = #{id}</when>
<when test="email != null">email = #{email}</when>
<when test="phone != null">phone = #{phone}</when>
<when test="name != null">name LIKE CONCAT('%', #{name}, '%')</when>
<otherwise>1 = 0</otherwise>
</choose>
</where>
</select>
优先级:id > email > phone > name,匹配到第一个就停止。
分页查询兼容
不同数据库分页语法不同,使用 choose 做兼容:
XML
<select id="findUser" resultType="User">
SELECT * FROM user
<where>
<if test="status != null">status = #{status}</if>
</where>
<choose>
<when test="dbType == 'oracle'">
<![CDATA[
WHERE ROWNUM <= #{limit}
]]>
</when>
<when test="dbType == 'sqlserver'">
OFFSET #{offset} ROWS FETCH NEXT #{limit} ROWS ONLY
</when>
<otherwise>
LIMIT #{limit} OFFSET #{offset}
</otherwise>
</choose>
</select>
与多个 if 的区别
多个 if 并列执行,choose 仅选其一:
| 结构 | 执行方式 | 适用场景 |
|---|---|---|
多个 <if> | 全部判断,true 的都执行 | 可选条件叠加 |
<choose> | 选第一个 true,停止 | 互斥条件,单选 |
XML
<!-- 多个 if:可叠加 -->
<if test="name != null">AND name LIKE #{pattern}</if>
<if test="age != null">AND age = #{age}</if>
<!-- 两个条件都满足时都执行 -->
<!-- choose:单选 -->
<choose>
<when test="type == 'name'">AND name LIKE #{pattern}</when>
<when test="type == 'age'">AND age = #{age}</when>
</choose>
<!-- 只选一个分支 -->
嵌套使用
choose 内部可嵌套其他动态标签:
XML
<choose>
<when test="searchType == 'advanced'">
<if test="name != null">name LIKE #{pattern}</if>
<if test="age != null">AND age = #{age}</if>
<if test="email != null">AND email = #{email}</if>
</when>
<when test="searchType == 'simple'">
name LIKE #{pattern} OR email LIKE #{pattern}
</when>
<otherwise>
1 = 1
</otherwise>
</choose>
注意事项
- choose 内必须至少有一个 when,otherwise 可选
- when 按书写顺序从上到下判断,优先级由位置决定
- 一旦命中某个 when,后续 when 和 otherwise 全部跳过
- otherwise 是兜底,所有 when 为 false 时才执行
要点总结
- choose-when-otherwise 类似 switch-case-default,按顺序匹配,仅执行第一个 true 分支
- 适用于互斥条件选择,如排序字段切换、搜索方式选择、数据库兼容
- 与多个 if 的区别:if 可叠加执行,choose 单选其一
- otherwise 为可选兜底,所有 when 不满足时执行
- when 内部可嵌套 if、bind、trim 等其他动态标签
📝 发现内容有误?点击此处直接编辑