mybatisplus 存null
时间: 2025-02-14 20:09:28 浏览: 86
MyBatis-Plus 是 MyBatis 的增强工具,它简化了 MyBatis 的使用并提供了一些额外的功能。关于存储 `null` 值的问题,在 MyBatis 和 MyBatis-Plus 中有一些特定的行为和配置可以处理。
### 存储 `null` 到数据库
默认情况下,如果你在实体类中将某个字段设置为 `null` 并尝试插入或更新记录到数据库,那么对应的列会被设为 `NULL`:
```java
User user = new User();
user.setId(1L);
// name 未赋值,默认为 null
userMapper.insert(user); // 插入用户信息时,name 字段会自动存为 NULL
```
但是有时候我们希望避免这种情况发生——例如当某些非空约束存在时不希望因为业务逻辑导致意外地保存了 `NULL` 数据;又或者是想给定一个默认值而不是直接存成 `null`。
#### 解决方案一: 使用注解 @TableField 或者全局配置
你可以通过添加 `@TableField` 注解,并指定策略来控制如何对待 `null`:
```java
public class User {
private Long id;
@TableField(updateStrategy = FieldStrategy.NOT_NULL)
private String name;
}
```
上述代码表示只有在 `name` 不为空的时候才会参与 SQL 更新操作。类似地也可以对其他类型的字段做这样的限制。
另外一种办法是在项目的启动类上应用全局过滤规则:
```yaml
mybatis-plus:
global-config:
db-config:
# 当插入时遇到 java 类型为 null 的属性,则跳过该字段
insert-strategy: not_null
update-strategy: not_empty # 同样适用于修改数据的情况
```
这种方式可以让所有映射都遵守这一原则而不需要逐个标注每个字段。
#### 解决方案二: 设置 default-value 属性 (针对 MySQL)
如果采用的是像MySQL这种支持 DEFAULT 关键字的数据表设计语言的话,可以直接设定好相应的缺省值即可。如创建 table 结构时候就明确指出某列为 NOT NULL AND DEFAULT 'something' 。此时即便程序端传来 null ,实际入库也不会出现真正意义上的 null 而是指向预定义好的那个常量项。
#### 方案三:手动编写插件或者拦截器
对于更复杂的需求来说还可以考虑自定义Plugin实现 Interceptor 接口来自行定制化处理流程,不过这通常需要比较深入理解框架内部机制才能做到得心应手的应用。
---
阅读全文
相关推荐













