MP(MyBatis-Plus)的自動填充功能
- 2021 年 1 月 11 日
- 筆記
- 08-框架:MyBatis, MP
什麼是自動填充
有些表中會有更新時間、創建時間、更新人或者創建人這些字段。
每次對數據進行新增、刪除、修改時都需要對這些字段進行設置。傳統的做法是在進行這些操作前,對Entity的字段進行set設置,然後再進行操作。這種做法不僅容易忘記導致出錯、而且代碼會顯得特別冗餘。
雖然新增時間和修改時間可以使用數據庫的時間,但是新增人和修改人就不能使用這樣的功能。
所以MP就提供自動填充的功能,幫助自定設置這些字段的值,提升開發效率,代碼也會顯得特別優雅。
使用MP實現自動填充
step1:在Entity上添加註解
// 插入數據時進行自動填充
@TableField(fill = FieldFill.INSERT)
private Date createTime;
// 更新數據時進行自動填充
@TableField(fill = FieldFill.UPDATE)
private Date updateTime;
step2:編寫自動填充實現類
@Configuration
@EnableTransactionManagement
@MapperScan("com.csx.demo.spring.boot.dao")
public class MyBatisPlusConfig {
private static final Logger log = LoggerFactory.getLogger(MyBatisPlusConfig.class);
// MetaObjectHandler 這接口有很多方法,一般情況下只需要實現這兩個方法就行了
// 其他方法感興趣的可以自己進去看下
@Component
public class MyFillHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
log.info("start insert fill ....");
// 起始版本 3.3.0(推薦使用)
this.strictInsertFill(metaObject, "createTime", Date.class, new Date());
}
@Override
public void updateFill(MetaObject metaObject) {
log.info("start update fill ....");
// 起始版本 3.3.0(推薦)
this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date());
}
}
}
關於上面的實現類,需要注意下面幾點:
- 需要實現com.baomidou.mybatisplus.core.handlers.MetaObjectHandler接口,而且整個Spring容器中只能有一個實現;
- MetaObjectHandler提供的默認方法的策略均為:如果屬性有值則不覆蓋,如果填充值為null則不填充;
- 要想根據註解FieldFill.xxx和字段名以及字段類型來區分必須使用父類的strictInsertFill或者strictUpdateFill方法;
- 不需要根據任何來區分可以使用父類的fillStrategy方法。