Mybatis之动态SQL


作用:  
自动生成 `WHERE` 关键字,并智能去除多余的 `AND` 或 `OR`,避免 SQL 语法错误。  
**场景**:  
当不确定哪些条件会被使用时,避免手动处理 `WHERE` 后的逻辑。

**示例**:  
```xml

```
**效果**:  
- 如果两个条件都满足 → `WHERE name = ? AND age = ?`  
- 如果只有 `name` 有效 → `WHERE name = ?`  
- 如果两个条件都无效 → 不生成 `WHERE`  

**类比**:  
就像餐厅服务员点菜时,自动忽略你不需要的菜品,只把有效的需求告诉厨房。

---

### **2. `` 标签**
**作用**:  
根据条件判断是否拼接某段 SQL。  
**场景**:  
动态决定是否包含某个字段或条件。

**示例**:  
```xml

  UPDATE user
 
    name = #{name},
    age = #{age},
 

  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 片段  
- ``:引用已定义的 SQL 片段  

**场景**:  
避免重复编写相同的 SQL 片段(如字段列表、公共条件)。  

**示例**:  
```xml

id, name, age



```
**效果**:  
等同于 `SELECT id, name, age FROM user`  

**类比**:  
就像把常用的地址信息保存为模板,需要时直接粘贴。

---

### **总结**
| 标签                | 作用                                 | 类比                   |
|---------------------|--------------------------------------|------------------------|
| ``           | 自动处理 `WHERE` 和多余的 `AND/OR`  | 智能服务员点菜          |
| ``              | 条件判断是否包含某段 SQL            | 根据天气决定是否带伞    |
| ``            | 自定义修剪 SQL 前后缀               | 修剪树枝                |
| ``/`` | 多条件中选其一                      | 多选一的出行方式        |
| ``         | 遍历集合生成批量 SQL                | 批量处理快递包裹        |
| ``/`` | 复用 SQL 片段                       | 使用模板粘贴地址        |

**注意事项**:  
- 避免在 `` 中手动写 `WHERE` 关键字。  
- `` 遍历集合时,注意参数名称和集合类型。  
- `` 片段中可以使用 `${}` 但需注意 SQL 注入风险。  

通过这些标签,MyBatis 可以灵活生成动态 SQL,适应各种复杂查询场景!

 

你可能感兴趣的:(mybatis,sql)