作用:
自动生成 `WHERE` 关键字,并智能去除多余的 `AND` 或 `OR`,避免 SQL 语法错误。
**场景**:
当不确定哪些条件会被使用时,避免手动处理 `WHERE` 后的逻辑。
**示例**:
```xml
```
**效果**:
- 如果两个条件都满足 → `WHERE name = ? AND age = ?`
- 如果只有 `name` 有效 → `WHERE name = ?`
- 如果两个条件都无效 → 不生成 `WHERE`
**类比**:
就像餐厅服务员点菜时,自动忽略你不需要的菜品,只把有效的需求告诉厨房。
---
### **2. `
**作用**:
根据条件判断是否拼接某段 SQL。
**场景**:
动态决定是否包含某个字段或条件。
**示例**:
```xml
UPDATE user
WHERE id = #{id}
```
**效果**:
- 如果 `name` 和 `age` 都有效 → `UPDATE user SET name=?, age=? WHERE id=?`
- 如果只有 `name` 有效 → `UPDATE user SET name=? WHERE id=?`
**类比**:
就像根据天气决定是否带伞:如果下雨,带伞;否则不带。
---
### **3. `
**作用**:
自定义修剪 SQL 的前缀/后缀,处理多余的字符(如 `AND`、`OR`、`,`)。
**属性**:
- `prefix`:添加前缀(如 `WHERE` 或 `SET`)
- `prefixOverrides`:去除多余的前缀(如 `AND | OR`)
- `suffixOverrides`:去除多余的后缀(如 `,`)
**示例**:
```xml
```
**效果**:
和 `
**类比**:
就像修剪树枝,去掉多余的枝干,保留需要的部分。
---
### **4. `
**作用**:
实现多选一逻辑(类似 Java 中的 `switch-case`)。
**场景**:
多个条件中只选择第一个满足的条件。
**示例**:
```xml
```
**效果**:
- 如果 `name` 有效 → 用 `name` 条件
- 如果 `name` 无效但 `email` 有效 → 用 `email` 条件
- 如果都无效 → 用 `status = 1`
**类比**:
就像选择出行方式:优先打车,打不到车就坐地铁,再不行就走路。
---
### **5. `
**作用**:
遍历集合(如 List、数组),生成批量操作的 SQL。
**常用属性**:
- `collection`:要遍历的集合
- `item`:遍历时的元素别名
- `open`/`close`:循环开始/结束时拼接的字符串
- `separator`:元素间的分隔符
**示例 1 - IN 查询**:
```xml
```
**效果**:
生成 `WHERE id IN (1, 2, 3)`
**示例 2 - 批量插入**:
```xml
INSERT INTO user (name, age) VALUES
(#{user.name}, #{user.age})
```
**效果**:
生成 `INSERT INTO user (name, age) VALUES (Alice, 20), (Bob, 25)`
**类比**:
就像批量处理快递包裹,逐个贴上地址标签,最后统一发货。
---
### **6. `
**作用**:
- `
- `
**场景**:
避免重复编写相同的 SQL 片段(如字段列表、公共条件)。
**示例**:
```xml
```
**效果**:
等同于 `SELECT id, name, age FROM user`
**类比**:
就像把常用的地址信息保存为模板,需要时直接粘贴。
---
### **总结**
| 标签 | 作用 | 类比 |
|---------------------|--------------------------------------|------------------------|
| `
| `
| `
| `
| `
| `
**注意事项**:
- 避免在 `
- `
- `
通过这些标签,MyBatis 可以灵活生成动态 SQL,适应各种复杂查询场景!