mybatis資料庫欄位自動填充
阿新 • • 發佈:2021-07-12
背景描述
目前,大多數專案的資料庫設計,都會新增一些公共欄位,比如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的邏輯刪除註解,大家有興趣的可以自行查詢資料。
然後,大家將自己的資料庫實體繼承這個基類就完成了。
這樣就配置完了,就是這麼簡單,趕快在自己的專案中用起來吧。
未來的事,誰也說不準,活在當下!