where 智能条件
<where> 标签是 <trim> 的快捷封装,自动在内部有内容时添加 WHERE 关键字,并智能移除首个多余的 AND 或 OR。
基本语法
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
移除首个多余的 AND 或 OR:
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>
prefixOverrides值AND | 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 仅移除首个
AND或OR,后续的连接符保持不变 - where 内部全为空时,不输出
WHERE关键字 - where 不能替代 trim,无法自定义前缀或移除其他字符(如逗号)
- where 仅处理前缀,不处理后缀(后缀裁剪需用 trim)
要点总结
- where 自动在内部有内容时添加 WHERE 关键字
- 智能移除首个多余的 AND 或 OR 前缀
- 等效于
<trim prefix="WHERE" prefixOverrides="AND | OR"> - 内部全为空时不输出 WHERE
- 适用于多条件动态查询,简化 AND/OR 拼接逻辑
📝 发现内容有误?点击此处直接编辑