1 自动填充功能介绍
自动填充功能可以在插入或修改时为对象属性自动赋值。
之前学习了逻辑删除字段,在向数据库插入数据时,都需要设置 isDeleted=0
,这在进行频繁地数据插入时就显得有些繁琐,于是 MybatisPlus 就为我们提供了自动填充的功能。
修改实体类,为需要自动填充的字段在注解 @TableField
中添加 fill
属性。
@TableLogic
@TableField(value = "isDeleted", fill = FieldFill.INSERT)
int isDeleted;
填充策略:
枚举值 | 描述 |
---|---|
DEFAULT | 默认值,不作填充 |
INSERT | 插入操作填充字段 |
UPDATE | 更新操作填充字段 |
INSERT_UPDATE | 插入操作和更新操作均填充字段 |
2 修改数据库
取消数据库中 isDeleted
列的默认值设置,这样在进行数据插入时,我们就必须要为该列设置数据。
3 修改实体类
实体类中,在 isDeleted
属性上的 @TableField
注解中增加 fill
属性,且将属性值设置为 FieldFill.INSERT
,因为我们只需要在对数据进行插入操作时,才会使用到自动填充功能。
注意:
之前是将 version
及 isDeleted
两个属性的类型设置为了 int
型,在插入数据时,程序会将 int
型自动初始化为数值0,就会失去对数据自动填充验证的效果。
因此,这里需要修改这两个属性的类型为包装类 Integer
类型。
4 创建填充处理类
新建一个 handler
包,并在包下创建填充处理类 FillObjectHandler
。
该类需要实现接口 MetaObjectHandler
,并重写该类的两个方法:
- 用于插入数据时实现的填充逻辑
insertFill()
; - 用于更新数据时实现的填充逻辑
updateFill()
。
因为我们只是在插入数据时,需要MybatisPlus帮助我们填充字段,因些这里仅处理 insertFill()
方法,将其使用 setFieldValByName()
方法作为填充规则:
方法中三个参数分别表示:
被填充的列;用来填充的数据;被填充的元对象。
这里可以理解成将 User 对象中的 isDeleted
字段填充为 0。
同时为了能让 SpringBoot 识别该处理类,需要在类上增加注解 @Component
。
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
@Component
public class FillObjectHandler implements MetaObjectHandler {
//数据插入时的填充逻辑
@Override
public void insertFill(MetaObject metaObject) {
this.setFieldValByName("isDeleted", 0, metaObject);
}
//数据更新时的填充逻辑
@Override
public void updateFill(MetaObject metaObject) {
}
}
5 自动填充效果验证
创建测试类,测试类中使用无参构造方法创建了实体类对象,并直接执行 insert()
方法。
@Test
public void testInsertUser(){
User user = new User();
user.insert();
}
查看控制台实际执行的SQL语句
==> Preparing: INSERT INTO user ( isDeleted ) VALUES ( ? )
==> Parameters: 0(Integer)
<== Updates: 1
数据使用自动填充功能成功入库。
我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!