MP(MyBatis-Plus)的自動填充功能

什麼是自動填充

有些表中會有更新時間、創建時間、更新人或者創建人這些字段。

每次對數據進行新增、刪除、修改時都需要對這些字段進行設置。傳統的做法是在進行這些操作前,對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方法。