mybatis 如何写 if else
时间: 2025-05-28 21:41:42 浏览: 34
### MyBatis 中实现 `if-else` 逻辑
在 MyBatis 的动态 SQL 中,可以使用 `<choose>`、`<when>` 和 `<otherwise>` 标签来实现类似于 Java 中的 `if-else` 或者 `switch-case` 的多分支条件逻辑。这种结构允许开发者根据不同的参数值执行特定的查询操作。
以下是具体的用法说明以及示例:
#### 使用 `<choose>`, `<when>`, `<otherwise>`
`<choose>` 是一个整体容器,用于包裹多个 `<when>` 条件和一个可选的 `<otherwise>` 部分。如果任意一个 `<when>` 条件成立,则会执行对应的 SQL 片段;如果没有 `<when>` 成立,则会执行 `<otherwise>` 定义的内容(如果有定义的话)。这种方式非常适合用来替代简单的 `if-else` 结构[^1]。
#### 示例代码
以下是一个完整的例子,展示了如何通过 `<choose>` 实现 `if-else` 功能:
```xml
<select id="selectUser" resultMap="BaseResultMap" parameterType="map">
SELECT
<include refid="Base_Column_List"/>
FROM users u
WHERE 1=1
<!-- 开始 choose -->
<choose>
<!-- 当 allFlag 不为空时 -->
<when test="allFlag != null and allFlag != ''">
AND u.status_cd = '0'
</when>
<!-- 否则执行 otherwise -->
<otherwise>
AND u.user_id IS NOT NULL
</otherwise>
</choose>
</select>
```
在这个例子中:
- 如果传入的参数 `allFlag` 存在且不为空字符串,则会在查询条件中加入 `AND u.status_cd = '0'`。
- 如果 `allFlag` 参数不存在或者为空字符串,则会默认加上 `AND u.user_id IS NOT NULL` 这一条件[^3]。
#### 另一种情况下的嵌套 `if`
除了上述方法外,在某些场景下也可以单纯依靠 `<if>` 标签完成更复杂的逻辑判断。虽然它不具备显式的 `else` 支持,但是可以通过组合多个 `<if>` 达到类似效果[^2]。
例如:
```xml
<select id="getScriptById" resultType="ScriptVO">
SELECT *
FROM scripts s
WHERE 1=1
<if test="scriptId != null">
AND s.script_id = #{scriptId}
</if>
<if test="scriptId == null">
AND s.is_default = 1
</if>
</select>
```
这里分别针对 `scriptId` 是否为 `null` 提供了两种不同路径的选择机制。
---
### 总结
无论是采用 `<choose>-<when>-<otherwise>` 组合还是单独利用 `<if>` 构建复杂表达式,都可以灵活满足实际开发需求中的各种分支判定要求。具体选用哪种方式取决于业务模型和个人编码习惯等因素影响。
阅读全文
相关推荐


















