全部学科
NodeJS全栈
nodejs
Python全栈
python
小程序首页
📅 2026-05-20 6 分钟 ✍️ juanwangdev

where 智能条件

<where> 标签是 <trim> 的快捷封装,自动在内部有内容时添加 WHERE 关键字,并智能移除首个多余的 ANDOR

基本语法

XML
<where>
    <!-- 动态条件 -->
</where>

自动添加 WHERE

内部有内容时,自动添加 WHERE 关键字:

XML
<select id="findUser" resultType="User">
    SELECT * FROM user
    <where>
        <if test="name != null">name LIKE CONCAT('%', #{name}, '%')</if>
    </where>
</select>

name != null 时:

SQL
SELECT * FROM user WHERE name LIKE ?

name == null 时:

SQL
SELECT * FROM user

自动去除 AND/OR

移除首个多余的 ANDOR

XML
<select id="findUser" resultType="User">
    SELECT * FROM user
    <where>
        <if test="name != null">AND name LIKE #{pattern}</if>
        <if test="age != null">AND age = #{age}</if>
        <if test="email != null">AND email = #{email}</if>
    </where>
</select>

传入 name="张", age=25, email=null 时,首个 AND 被移除:

SQL
SELECT * FROM user WHERE name LIKE ? AND age = ?

等效 trim 配置

<where> 等价于:

XML
<trim prefix="WHERE" prefixOverrides="AND | OR">
    <!-- 动态条件 -->
</trim>

prefixOverridesAND | OR 中的空格不可省略,否则无法匹配。

OR 条件处理

首个 OR 同样被移除:

XML
<select id="searchUser" resultType="User">
    SELECT * FROM user
    <where>
        <if test="name != null">OR name LIKE #{pattern}</if>
        <if test="email != null">OR email LIKE #{pattern}</if>
    </where>
</select>

传入 name="张", email="test@test.com" 时:

SQL
SELECT * FROM user WHERE name LIKE ? OR email LIKE ?

与 choose 配合使用

XML
<select id="findUser" resultType="User">
    SELECT * FROM user
    <where>
        <if test="status != null">status = #{status}</if>
        <choose>
            <when test="searchBy == 'name'">AND name LIKE #{pattern}</when>
            <when test="searchBy == 'email'">AND email = #{email}</when>
        </choose>
    </where>
</select>

注意事项

  • where 仅移除首个 ANDOR,后续的连接符保持不变
  • where 内部全为空时,不输出 WHERE 关键字
  • where 不能替代 trim,无法自定义前缀或移除其他字符(如逗号)
  • where 仅处理前缀,不处理后缀(后缀裁剪需用 trim)

要点总结

  • where 自动在内部有内容时添加 WHERE 关键字
  • 智能移除首个多余的 AND 或 OR 前缀
  • 等效于 <trim prefix="WHERE" prefixOverrides="AND | OR">
  • 内部全为空时不输出 WHERE
  • 适用于多条件动态查询,简化 AND/OR 拼接逻辑

📝 发现内容有误?点击此处直接编辑

← 上一篇 trim 自定义裁剪
下一篇 → discriminator 鉴别器
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库