Mybatis-Plus使用MetaObjectHandler實現(xiàn)自動填充實體對象字段
1.描述
在我們使用Mybatis-Plus時,一些簡單的CRUD。你會發(fā)現(xiàn)好多表,許多字段是重復(fù)的,比如:createTime、updateTime、createBy、updateBy等字段。如果我們每次更新或者新增,都要手動賦值,那么會出現(xiàn)許多不必要的重復(fù)操作。那Mybatis-Plus有沒有一種方案,可以減少這種重復(fù)操作呢?當然是有的,那就是MetaObjectHandler(元對象處理)。
主要功能
- 自動填充:可以在插入(insert)或更新(update)數(shù)據(jù)庫記錄時,自動填充指定的字段值。這對于記錄的創(chuàng)建時間和最后更新時間非常有用。
- 靈活配置:可以通過注解或者全局配置的方式,指定哪些字段需要自動填充,以及在什么情況下進行填充(如僅在插入時,或是在插入和更新時都進行填充)。
- 集成簡單:只需要實現(xiàn) MetaObjectHandler 接口,并重寫相應(yīng)的方法即可。同時,在 Spring Boot 應(yīng)用中,只需將其實現(xiàn)類標記為 @Component,就可以自動生效
2.編碼
2.1 定義實體類
首先定義一個實體類,并使用 @TableField
注解來指定哪些字段需要自動填充。例如:
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 實現(xiàn) MetaObjectHandler
創(chuàng)建一個類實現(xiàn) MetaObjectHandler
接口,并覆蓋 insertFill
和 updateFill
方法。在這個方法中,根據(jù)字段的屬性來決定是否填充以及填充什么樣的值。例如:
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
確保你的項目中已經(jīng)正確配置了 MyBatis-Plus。通常情況下,如果你是使用 Spring Boot,則只需要添加 MyBatis-Plus 的依賴,并在 application.properties
或 application.yml
中做基本配置即可。
3.總結(jié)
- 當你實現(xiàn)了
MetaObjectHandler
并希望它能生效時,確保該類已經(jīng)被 Spring 容器管理(即加上@Component
注解)。 - 如果你的項目中有多個
MetaObjectHandler
實現(xiàn),它們會按照 Spring Bean 的加載順序依次執(zhí)行。 - 在使用
strictInsertFill
和strictUpdateFill
方法時,確保傳遞的類型與實體類中字段的類型相匹配,否則可能會拋出異常。 - 通過這種方式,MyBatis-Plus 能夠極大地簡化開發(fā)過程中的數(shù)據(jù)操作,減少手動設(shè)置字段值的工作量,提高開發(fā)效率。
到此這篇關(guān)于Mybatis-Plus使用MetaObjectHandler實現(xiàn)自動填充實體對象字段的文章就介紹到這了,更多相關(guān)Mybatis-Plus自動填充對象字段內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mybatis?Plus使用XML編寫動態(tài)sql的超簡易方法
這篇文章主要介紹了Mybatis?Plus使用XML編寫動態(tài)sql的超簡易方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01springboot 設(shè)置局域網(wǎng)訪問的實現(xiàn)步驟
Spring Boot是一個開源Java-based框架,用于創(chuàng)建獨立的、生產(chǎn)級別的Spring應(yīng)用,它旨在簡化Spring應(yīng)用的初始搭建及開發(fā)過程,通過提供各種自動配置的starter包,Spring Boot使得項目配置變得簡單快速,感興趣的朋友一起看看吧2024-02-02