Mybatis-Plus使用MetaObjectHandler实现自动填充实体对象字段

 更新时间:2024年11月20日 09:09:08   作者:要开心吖ZSH  
在我们使用Mybatis-Plus时,一些简单的CRUD,你会发现好多表,许多字段是重复的,如果我们每次更新或者新增,都要手动赋值,那么会出现许多不必要的重复操作,所以本文介绍了Mybatis-Plus使用MetaObjectHandler实现自动填充实体对象字段,需要的朋友可以参考下

1.描述

在我们使用Mybatis-Plus时,一些简单的CRUD。你会发现好多表,许多字段是重复的,比如:createTime、updateTime、createBy、updateBy等字段。如果我们每次更新或者新增,都要手动赋值,那么会出现许多不必要的重复操作。那Mybatis-Plus有没有一种方案,可以减少这种重复操作呢?当然是有的,那就是MetaObjectHandler(元对象处理)。

主要功能

  • 自动填充:可以在插入(insert)或更新(update)数据库记录时,自动填充指定的字段值。这对于记录的创建时间和最后更新时间非常有用。
  • 灵活配置:可以通过注解或者全局配置的方式,指定哪些字段需要自动填充,以及在什么情况下进行填充(如仅在插入时,或是在插入和更新时都进行填充)。
  • 集成简单:只需要实现 MetaObjectHandler 接口,并重写相应的方法即可。同时,在 Spring Boot 应用中,只需将其实现类标记为 @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 实现 MetaObjectHandler

创建一个类实现 MetaObjectHandler 接口,并覆盖 insertFill 和 updateFill 方法。在这个方法中,根据字段的属性来决定是否填充以及填充什么样的值。例如:

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

确保你的项目中已经正确配置了 MyBatis-Plus。通常情况下,如果你是使用 Spring Boot,则只需要添加 MyBatis-Plus 的依赖,并在 application.properties 或 application.yml 中做基本配置即可。

3.总结

  • 当你实现了 MetaObjectHandler 并希望它能生效时,确保该类已经被 Spring 容器管理(即加上 @Component 注解)。
  • 如果你的项目中有多个 MetaObjectHandler 实现,它们会按照 Spring Bean 的加载顺序依次执行。
  • 在使用 strictInsertFill 和 strictUpdateFill 方法时,确保传递的类型与实体类中字段的类型相匹配,否则可能会抛出异常。
  • 通过这种方式,MyBatis-Plus 能够极大地简化开发过程中的数据操作,减少手动设置字段值的工作量,提高开发效率。

到此这篇关于Mybatis-Plus使用MetaObjectHandler实现自动填充实体对象字段的文章就介绍到这了,更多相关Mybatis-Plus自动填充对象字段内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot 下的 Static 文件夹打包成前端资源的示例代码

    SpringBoot 下的 Static 文件夹打包成前端资源的示例代码

    这篇文章主要介绍了SpringBoot 下的 Static 文件夹如何打包成前端资源,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06
  • java使用链表来模拟栈的入栈出栈操作实例代码

    java使用链表来模拟栈的入栈出栈操作实例代码

    这篇文章主要介绍了java 使用链表来模拟栈的入栈出栈操作,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • JVM双亲委派模型知识详细总结

    JVM双亲委派模型知识详细总结

    今天带各位小伙伴学习Java虚拟机的相关知识,文中对JVM双亲委派模型作了非常详细的介绍,对正在学习java的小伙伴们有很好的帮助,需要的朋友可以参考下
    2021-05-05
  • 解决idea check out 切换分支时找不到需要的分支问题

    解决idea check out 切换分支时找不到需要的分支问题

    这篇文章主要介绍了解决idea check out 切换分支时找不到需要的分支问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • maven的卸载与安装实现方式

    maven的卸载与安装实现方式

    这篇文章主要介绍了maven的卸载与安装实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2026-03-03
  • java中Lambda常用场景代码实例

    java中Lambda常用场景代码实例

    这篇文章主要介绍了java中Lambda常用场景,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • IDEA最新版2020.1的maven工程本地依赖仓库无法使用问题(已解决)

    IDEA最新版2020.1的maven工程本地依赖仓库无法使用问题(已解决)

    这篇文章主要介绍了IDEA最新版2020.1的maven工程本地依赖仓库无法使用问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • 解决java 分割字符串成数组时,小圆点不能直接进行分割的问题

    解决java 分割字符串成数组时,小圆点不能直接进行分割的问题

    这篇文章主要介绍了解决java 分割字符串成数组时,小圆点不能直接进行分割的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Java怎么重命名 Amazon S3 中的文件和文件夹

    Java怎么重命名 Amazon S3 中的文件和文件夹

    在本文中,我们探讨了使用适用于 Java 的 AWS 开发工具包重命名 S3 存储桶中的文件和文件夹的方法,我们探索了两种不同的情况,它们使用相同的概念来重命名对象,用新名称复制它们并删除原始名称
    2023-10-10
  • Java线程间协作wait、notify和notifyAll详解

    Java线程间协作wait、notify和notifyAll详解

    这篇文章主要介绍了Java线程间协作wait、notify和notifyAll详解,在 Java 中可以用 wait、notify 和 notifyAll 来实现线程间的通信,尽管关于wait和notify的概念很基础,它们也都是Object类的函数,但用它们来写代码却并不简单,,需要的朋友可以参考下
    2023-10-10

最新评论