1. MyBatis动态SQL之choose/when/otherwise深度解析
在MyBatis框架中处理复杂查询条件时,动态SQL是我们的得力助手。今天要重点拆解的是<choose>、<when>和<otherwise>这套组合标签,它相当于Java中的if-else if-else逻辑结构,但有着独特的XML实现方式和应用场景。
1.1 基础语法与语义
这三个标签总是配合使用,形成完整的条件判断逻辑链:
xml复制<choose>
<when test="条件表达式1">
<!-- 满足条件1时执行的SQL片段 -->
</when>
<when test="条件表达式2">
<!-- 满足条件2时执行的SQL片段 -->
</when>
<otherwise>
<!-- 所有when条件都不满足时执行的SQL片段 -->
</otherwise>
</choose>
重要规则:
<when>至少需要一个,而<otherwise>最多只能有一个。这与Java语法中else if可以无限延伸但else只能有一个的设计理念一致。
1.2 与if标签的核心差异
很多初学者容易混淆<if>和<choose>的使用场景,它们的本质区别在于:
<if>是独立判断,每个条件都会单独评估,可能多个条件同时生效<choose>是互斥选择,一旦某个<when>条件满足,就会跳过后续判断
假设我们要根据用户等级显示不同优惠信息:
xml复制<!-- if实现(可能同时满足多个条件) -->
<if test="vipLevel == 1">送10元券</if>
<if test="vipLevel >= 1">免运费</if>
<!-- choose实现(互斥执行) -->
<choose>
<when test="vipLevel == 3">8折优惠</when>
<when test="vipLevel == 2">9折优惠</when>
<otherwise>无折扣</otherwise>
</choose>
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
