Mybatis-Plus使用MetaObjectHandler實(shí)現(xiàn)自動(dòng)填充實(shí)體對(duì)象字段
1.描述
在我們使用Mybatis-Plus時(shí),一些簡(jiǎn)單的CRUD。你會(huì)發(fā)現(xiàn)好多表,許多字段是重復(fù)的,比如:createTime、updateTime、createBy、updateBy等字段。如果我們每次更新或者新增,都要手動(dòng)賦值,那么會(huì)出現(xiàn)許多不必要的重復(fù)操作。那Mybatis-Plus有沒(méi)有一種方案,可以減少這種重復(fù)操作呢?當(dāng)然是有的,那就是MetaObjectHandler(元對(duì)象處理)。
主要功能
- 自動(dòng)填充:可以在插入(insert)或更新(update)數(shù)據(jù)庫(kù)記錄時(shí),自動(dòng)填充指定的字段值。這對(duì)于記錄的創(chuàng)建時(shí)間和最后更新時(shí)間非常有用。
- 靈活配置:可以通過(guò)注解或者全局配置的方式,指定哪些字段需要自動(dòng)填充,以及在什么情況下進(jìn)行填充(如僅在插入時(shí),或是在插入和更新時(shí)都進(jìn)行填充)。
- 集成簡(jiǎn)單:只需要實(shí)現(xiàn) MetaObjectHandler 接口,并重寫(xiě)相應(yīng)的方法即可。同時(shí),在 Spring Boot 應(yīng)用中,只需將其實(shí)現(xiàn)類標(biāo)記為 @Component,就可以自動(dòng)生效
2.編碼
2.1 定義實(shí)體類
首先定義一個(gè)實(shí)體類,并使用 @TableField 注解來(lái)指定哪些字段需要自動(dòng)填充。例如:
package com.chinaunicom.medical.ihm.core.model;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.time.LocalDateTime;
import java.util.Date;
public class BaseModel extends IdModel {
@TableField(fill = FieldFill.INSERT)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime createTime;
@TableField(fill = FieldFill.INSERT)
private String createBy;
@TableField(fill = FieldFill.INSERT_UPDATE)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime updateTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private String updateBy;
@Version
@TableField(fill = FieldFill.INSERT)
private Integer version;
@TableLogic
@TableField(fill = FieldFill.INSERT)
private Integer deleted;
public String getCreateBy() {
return createBy;
}
public void setCreateBy(String createBy) {
this.createBy = createBy;
}
public String getUpdateBy() {
return updateBy;
}
public void setUpdateBy(String updateBy) {
this.updateBy = updateBy;
}
public Integer getDeleted() {
return deleted;
}
public void setDeleted(Integer deleted) {
this.deleted = deleted;
}
public Integer getVersion() {
return version;
}
public void setVersion(Integer version) {
this.version = version;
}
public LocalDateTime getCreateTime() {
return createTime;
}
public void setCreateTime(LocalDateTime createTime) {
this.createTime = createTime;
}
public LocalDateTime getUpdateTime() {
return updateTime;
}
public void setUpdateTime(LocalDateTime updateTime) {
this.updateTime = updateTime;
}
}2.2 實(shí)現(xiàn) MetaObjectHandler
創(chuàng)建一個(gè)類實(shí)現(xiàn) MetaObjectHandler 接口,并覆蓋 insertFill 和 updateFill 方法。在這個(gè)方法中,根據(jù)字段的屬性來(lái)決定是否填充以及填充什么樣的值。例如:
package com.chinaunicom.medical.ihm.core.model;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.chinaunicom.medical.ihm.core.context.SysContextHolder;
import org.apache.ibatis.reflection.MetaObject;
import java.time.LocalDateTime;
import java.util.Optional;
@Component
public class DateMetaObjectHandler implements MetaObjectHandler {
private String createTimeField = "createTime";
private String updateTimeField = "updateTime";
private String createByField = "createBy";
private String updateByField = "updateBy";
private String versionField = "version";
private String deletedField = "deleted";
private String appIdField = "appId";
private String tenantIdField = "tenantId";
private String instanceIdField = "instanceId";
@Override
public void insertFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, createTimeField, LocalDateTime.class, LocalDateTime.now());
this.strictInsertFill(metaObject, updateTimeField, LocalDateTime.class, LocalDateTime.now());
this.strictInsertFill(metaObject, versionField, Integer.class, 0);
this.strictInsertFill(metaObject, deletedField, Integer.class, 0);
this.strictInsertFill(metaObject, createByField, String.class, String.valueOf(Optional.ofNullable(SysContextHolder.getUserId()).orElse(0L)));
this.strictInsertFill(metaObject, updateByField, String.class, String.valueOf(Optional.ofNullable(SysContextHolder.getUserId()).orElse(0L)));
// this.strictInsertFill(metaObject, appIdField, Long.class, SysContextHolder.getApp());
// this.strictInsertFill(metaObject, tenantIdField, Long.class, SysContextHolder.getTenant());
// this.strictInsertFill(metaObject, instanceIdField, Long.class, SysContextHolder.getApplication());
}
@Override
public void updateFill(MetaObject metaObject) {
setFieldValByName(updateTimeField, LocalDateTime.now(), metaObject);
setFieldValByName(updateByField, String.valueOf(Optional.ofNullable(SysContextHolder.getUserId()).orElse(0L)), metaObject);
}
}2.3 配置 MyBatis-Plus
確保你的項(xiàng)目中已經(jīng)正確配置了 MyBatis-Plus。通常情況下,如果你是使用 Spring Boot,則只需要添加 MyBatis-Plus 的依賴,并在 application.properties 或 application.yml 中做基本配置即可。
3.總結(jié)
- 當(dāng)你實(shí)現(xiàn)了
MetaObjectHandler并希望它能生效時(shí),確保該類已經(jīng)被 Spring 容器管理(即加上@Component注解)。 - 如果你的項(xiàng)目中有多個(gè)
MetaObjectHandler實(shí)現(xiàn),它們會(huì)按照 Spring Bean 的加載順序依次執(zhí)行。 - 在使用
strictInsertFill和strictUpdateFill方法時(shí),確保傳遞的類型與實(shí)體類中字段的類型相匹配,否則可能會(huì)拋出異常。 - 通過(guò)這種方式,MyBatis-Plus 能夠極大地簡(jiǎn)化開(kāi)發(fā)過(guò)程中的數(shù)據(jù)操作,減少手動(dòng)設(shè)置字段值的工作量,提高開(kāi)發(fā)效率。
到此這篇關(guān)于Mybatis-Plus使用MetaObjectHandler實(shí)現(xiàn)自動(dòng)填充實(shí)體對(duì)象字段的文章就介紹到這了,更多相關(guān)Mybatis-Plus自動(dòng)填充對(duì)象字段內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot 下的 Static 文件夾打包成前端資源的示例代碼
這篇文章主要介紹了SpringBoot 下的 Static 文件夾如何打包成前端資源,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06
java使用鏈表來(lái)模擬棧的入棧出棧操作實(shí)例代碼
這篇文章主要介紹了java 使用鏈表來(lái)模擬棧的入棧出棧操作,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03
解決idea check out 切換分支時(shí)找不到需要的分支問(wèn)題
這篇文章主要介紹了解決idea check out 切換分支時(shí)找不到需要的分支問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02
java中Lambda常用場(chǎng)景代碼實(shí)例
這篇文章主要介紹了java中Lambda常用場(chǎng)景,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
IDEA最新版2020.1的maven工程本地依賴倉(cāng)庫(kù)無(wú)法使用問(wèn)題(已解決)
這篇文章主要介紹了IDEA最新版2020.1的maven工程本地依賴倉(cāng)庫(kù)無(wú)法使用問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
解決java 分割字符串成數(shù)組時(shí),小圓點(diǎn)不能直接進(jìn)行分割的問(wèn)題
這篇文章主要介紹了解決java 分割字符串成數(shù)組時(shí),小圓點(diǎn)不能直接進(jìn)行分割的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12
Java線程間協(xié)作wait、notify和notifyAll詳解
這篇文章主要介紹了Java線程間協(xié)作wait、notify和notifyAll詳解,在 Java 中可以用 wait、notify 和 notifyAll 來(lái)實(shí)現(xiàn)線程間的通信,盡管關(guān)于wait和notify的概念很基礎(chǔ),它們也都是Object類的函數(shù),但用它們來(lái)寫(xiě)代碼卻并不簡(jiǎn)單,,需要的朋友可以參考下2023-10-10

