mybatis數據庫字段自動填充


背景描述

目前,大多數項目的數據庫設計,都會添加一些公共字段,比如version(版本號)、deleted(邏輯刪除標識)、create_time、update_time、create_by、update_by,這些字段都是在各個業務里分開處理的。

這是,mybatis給我們提供了一種便利的方式,采用切面的方式進行實現。

實現過程

第一步,直接上代碼

import java.util.Date;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; /** * 數據庫公共字段填充
*/ @Configuration public class MapperObjectHandler implements MetaObjectHandler { // 通常項目會有登錄攔截,然后將用戶信息緩存到當前線程,這里可以根據實際項目實現,也可參考我其它博客實現登錄信息緩存 @Autowired CacheService cacheService; /** 數據庫int類型字段默認值 */ private static final int DEFAULT_DB_INIT_DELETED_VALUE = 0; private static final int DEFAULT_DB_INIT_VERSION_VALUE = 1; @Override public void insertFill(MetaObject metaObject) { String username; if (cacheService.getUserInfo() == null) { username = "nc"; } else { username = cacheService.getUserInfo().getNickname(); } this.setFieldValByName("deleted", DEFAULT_DB_INIT_DELETED_VALUE, metaObject); this.setFieldValByName("version", DEFAULT_DB_INIT_VERSION_VALUE, metaObject); if (this.getFieldValByName("createBy", metaObject) == null) { this.setFieldValByName("createBy", username, metaObject); } if (this.getFieldValByName("createTime", metaObject) == null) { this.setFieldValByName("createTime", new Date(), metaObject); } this.setFieldValByName("updateBy", username, metaObject); this.setFieldValByName("updateTime", new Date(), metaObject); } @Override public void updateFill(MetaObject metaObject) { String username; if (cacheService.getUserInfo() == null) { username = "nc"; } else { username = cacheService.getUserInfo().getNickname(); } Object versionObj = this.getFieldValByName("version", metaObject); version += 1; this.setFieldValByName("version", version, metaObject); if (this.getFieldValByName("updateBy", metaObject) == null) { this.setFieldValByName("updateBy", username, metaObject); } this.setFieldValByName("updateTime", new Date(), metaObject); } }

mybatis提供了MeteObjectHandler接口,繼承這個接口即可自定義實現字段填充,這個接口也提供了大量方法,大家也可以進去看下源碼,直接采用如下方法來實現。

 

第二步,抽離公共字段,新建公共字段基類(以下省略get和set方法)

public class BaseEntity {

    @TableLogic
    @TableField(fill = FieldFill.INSERT)
    private Integer deleted;

    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer version;

    @TableField(fill = FieldFill.INSERT)
    private Date createTime;

    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;

    @TableField(fill = FieldFill.INSERT)
    private String createBy;

    @TableField(fill = FieldFill.INSERT_UPDATE)
    private String updateBy;
}

一般有兩個場景需要填充默認值,insert和update,根據實際場景配置就好,@TableLogic是mybatisplus的邏輯刪除注解,大家有興趣的可以自行查找資料。

然后,大家將自己的數據庫實體繼承這個基類就完成了。

 

這樣就配置完了,就是這么簡單,趕快在自己的項目中用起來吧。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM