mybatis plus 批量更新字段,字段是空的。更新中有这个字段的更新,但是实际没更新到
时间: 2025-04-06 20:14:19 浏览: 67
MyBatis Plus 的批量更新操作中,如果某个字段为空值,在某些场景下可能会导致该字段未被成功更新的问题。这通常是因为 MyBatis Plus 默认会忽略掉 `null` 值的字段。
### 分析原因及解决方案
#### 可能的原因
1. **策略问题**:MyBatis Plus 中,默认开启的是 `update selective` 策略,即只对非空字段生成 SQL 更新语句。
2. **FieldFill 注解影响**:如果你给字段加了 `@TableField(fill = FieldFill.INSERT)` 或者类似注解,并且当前不在指定的填充范围,则可能不会生效。
3. **SQL 生成机制**:当字段为 `null` 时,MyBatis Plus 不会在生成的动态 SQL 中包含此字段。
---
### 解决方案
以下是几种常见的解决办法:
#### 方法一:修改全局配置
可以在 `mybatis-plus.global-config.db-config.id-type` 配置文件中调整默认的行为模式。例如:
```yaml
mybatis-plus:
global-config:
db-config:
field-strategy: NOT_NULL # 设置为NOT_NULL允许插入NULL值
```
#### 方法二:手动设置 updateWrapper 条件
通过构造自定义的 `UpdateWrapper` 明确地添加需要更新的所有字段条件,包括那些可能是空值的情况:
```java
UpdateWrapper<YourEntity> wrapper = new UpdateWrapper<>();
wrapper.eq("id", yourId);
yourEntity.setYourField(null); // 直接将目标字段设为 null 并传入 entity 对象内
int result = yourMapper.update(yourEntity, wrapper);
if (result > 0) {
System.out.println("更新成功");
} else {
System.out.println("无符合条件的数据记录或失败!");
}
```
这种方法可以强制把字段纳入更新范围内,即便它的新值是 `null`。
#### 方法三:使用 @TableField(strategy=FieldStrategy.NOT_NULL)
针对个别实体类属性单独处理,标记其支持 `null` 插入/更新:
```java
@TableField(updateStrategy = FieldStrategy.IGNORED, insertStrategy = FieldStrategy.NOT_NULL)
private String yourFieldName;
```
注意这里的选项含义:
- `IGNORED`: 完全忽视本字段是否参与任何 DML 操作;
- `NOT_NULL`: 当前字段若存在不是 NULL 则加入操作列表;反之跳过。
---
### 示例代码片段
下面是一段完整演示如何完成带 `null` 字段更新的例子:
```java
// 构建待更新的对象实例
User user = new User();
user.setId(1L); // 主键ID用于定位数据行
user.setName(null); // 我们希望这一列为 null 被更新进去
user.setEmail("[email protected]");
// 创建包装器设定过滤规则
UpdateWrapper<User> uw = new UpdateWrapper<>();
uw.eq("id", user.getId());
// 调用 mapper 层执行更新动作
boolean success = userService.update(user, uw);
System.out.println(success ? "用户信息已更新" : "未能找到对应条目进行更改");
```
---
阅读全文
相关推荐


















