在阿里開發手冊的建表規約中有說明,數據庫表中應該都要有create_time、update_time
字段;那麼在開發中,對於這些共有字段的處理應該要進行統一,這樣就可以簡化我們的開發過程。那麼本文就對Mybatis-Plus
中的字段自動填充進行記錄。
場景介紹
在項目的數據表設計中,每張表都有create_id、create_time、update_id、update_time
這四個字段,那麼在Java應用中,針對新增和修改操作要對這四個字段進行相應的更改:
create_id、update_id
要自動填充爲當前登錄的用戶IDcreate_time、update_time
要自動填充爲當前時間
下面說說代碼實現:
自動填充處理器
需要實現Mybatis-Plus
中的MetaObjectHandler
接口
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import hw.topevery.basis.runtime.UserRuntime;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.util.Objects;
/**
* 更新相關字段處理器
*
* @author whw
* @date 2020/1/3 16:41
*/
@Component
public class UpdateRelatedFieldsMetaHandler implements MetaObjectHandler {
/**
* 新增操作
*
* @param metaObject
*/
@Override
public void insertFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "createId", String.class, getCurrentUserId());
this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
this.strictInsertFill(metaObject, "updateId", String.class, getCurrentUserId());
this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}
/**
* 更新操作
*
* @param metaObject
*/
@Override
public void updateFill(MetaObject metaObject) {
this.strictUpdateFill(metaObject, "updateId", String.class, getCurrentUserId());
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}
/**
* 獲取當前登錄用戶ID
*
* @return
*/
private String getCurrentUserId() {
return "當前登錄用戶ID";
}
}
Mybatis-Plus配置類
需要將處理器注入緊Spring容器纔會生效
import com.baomidou.mybatisplus.core.config.GlobalConfig;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import hw.topevery.kunming.wapi.handler.UpdateRelatedFieldsMetaHandler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* Mybatis-Plus配置類
*
* @author whw
* @date 2020/1/3 16:41
*/
@Configuration
public class MybatisPlusConfig {
@Bean
public GlobalConfig globalConfig() {
GlobalConfig globalConfig = new GlobalConfig();
globalConfig.setMetaObjectHandler(new UpdateRelatedFieldsMetaHandler());
return globalConfig;
}
}
配置實體類中相關字段的自動填充策略
在@TableField
註解中設置fill
屬性
字段填充策略FieldFill
說明
值 | 描述 |
---|---|
DEFAULT | 默認不處理 |
INSERT | 插入填充字段 |
UPDATE | 更新填充字段 |
INSERT_UPDATE | 插入和更新填充字段 |
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* 基礎實體類
*
* @author whw
* @date 2020/1/3 17:37
*/
@Data
public class BaseEntity implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "創建用戶ID")
@TableField(value = "c_create_id", fill = FieldFill.INSERT)
private String createId;
@ApiModelProperty(value = "創建時間")
@TableField(value = "c_create_time", fill = FieldFill.INSERT)
private LocalDateTime createTime;
@ApiModelProperty(value = "更新用戶ID")
@TableField(value = "c_update_id", fill = FieldFill.INSERT_UPDATE)
private String updateId;
@ApiModelProperty(value = "更新時間")
@TableField(value = "c_update_time", fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
}
我這邊是在實體中抽取了一個父類出來,當然也可以直接在實體類的對應字段上添加註解。