mybatis iftest
时间: 2025-05-08 13:17:12 浏览: 32
### MyBatis 中 `if` 测试语句的用法
MyBatis 提供了一种动态 SQL 的功能,允许开发者根据条件生成不同的 SQL 查询。其中最常用的标签之一就是 `<if>` 标签,它用于判断某个条件是否成立并决定是否执行对应的 SQL 片段。
#### 基本语法
以下是 `<if>` 标签的基本语法:
```xml
<if test="condition">
SQL fragment
</if>
```
这里的 `test` 属性是一个 OGNL 表达式[^1],用来评估布尔表达式的真假值。如果该表达式返回 true,则会将 `<if>` 标签内的 SQL 片段加入到最终生成的 SQL 语句中;否则忽略此片段。
#### 使用场景举例
假设有一个查询书籍的功能,可以根据书名或者作者来筛选数据。可以这样定义 Mapper 文件中的 SQL:
```xml
<select id="findBooks" parameterType="map" resultType="Book">
SELECT * FROM books WHERE 1=1
<if test="title != null">
AND title = #{title}
</if>
<if test="author != null">
AND author = #{author}
</if>
</select>
```
在这个例子中,“WHERE 1=1” 是一种常见的技巧,目的是为了简化后续逻辑处理。当参数 `title` 或者 `author` 存在时,相应的过滤条件会被追加到 SQL 语句后面[^2]。
#### 复杂条件组合
有时候可能需要更复杂的条件匹配,比如同时满足多个字段不为空的情况才能应用某些特定规则。这时可以通过嵌套的方式实现:
```xml
<where>
<if test="category != null and category != ''">
category=#{category}
</if>
<if test="price != null">
AND price < #{price}
</if>
</where>
```
这里还引入了一个新的标签 `<where>` ,它可以自动管理前缀 “AND/OR”,并且只有在其内部至少存在一个有效子节点的情况下才会输出完整的 WHERE 子句[^3]。
#### 注意事项
- **NULL 和空字符串的区别**:在 Java 中 `"null"` 并不代表实际意义上的 NULL 而是普通的 String 对象。因此,在编写 IF 判断的时候要注意区分这两种情况。
- **SQL 注入防护**:虽然通过 `${}` 可以直接插入变量值,但这容易引发安全风险。推荐始终采用预编译方式即 `#{}` 来传递参数[^4]。
---
### 示例代码展示
下面给出一段基于上述理论的实际编码案例:
```java
public interface BookMapper extends BaseMapper<Book> {
}
// XML Configuration
<select id="searchBooks" parameterType="SearchCriteria" resultType="Book">
SELECT *
FROM book b
<where>
<if test="genre != null">b.genre = #{genre}</if>
<if test="minPrice != null">AND b.price >= #{minPrice}</if>
<if test="maxPrice != null">AND b.price <= #{maxPrice}</if>
</where>
</select>
@Data
@AllArgsConstructor
@NoArgsConstructor
public class SearchCriteria {
private String genre;
private Double minPrice;
private Double maxPrice;
}
```
以上展示了如何利用 MyBatis 动态构建复杂查询的能力,同时也体现了良好的实践习惯——封装输入对象以便于维护和扩展。
---
阅读全文
相关推荐


















