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新手入门的快速教程

    SpringBoot新手入门的快速教程

    这篇文章主要给大家介绍了关于SpringBoot新手入门的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用SpringBoot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-12-12
  • IDEA 格式化SQL代码技巧分享

    IDEA 格式化SQL代码技巧分享

    这篇文章主要介绍了IDEA 格式化SQL代码技巧分享,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • Mybatis Plus使用XML编写动态sql的超简易方法

    Mybatis Plus使用XML编写动态sql的超简易方法

    这篇文章主要介绍了Mybatis Plus使用XML编写动态sql的超简易方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • java 中 ChannelHandler的用法详解

    java 中 ChannelHandler的用法详解

    这篇文章主要介绍了java 中 ChannelHandler的用法详解的相关资料,ChannelHandler处理一个I/O event或者拦截一个I/O操作,需要的朋友可以参考下
    2017-08-08
  • 一文带你弄懂Maven拉包(拉取依赖包)原理

    一文带你弄懂Maven拉包(拉取依赖包)原理

    业务需求开发的时候,我们总是会遇到拉不到依赖包的情况,此时如果不清楚 Maven 拉取依赖包的原理,那么很可能找不到问题所在,今天小编就带大家了解下 Maven 拉包的原理,让你在遇到问题的时候能快速解决,需要的朋友可以参考下
    2023-07-07
  • springboot 设置局域网访问的实现步骤

    springboot 设置局域网访问的实现步骤

    Spring Boot是一个开源Java-based框架,用于创建独立的、生产级别的Spring应用,它旨在简化Spring应用的初始搭建及开发过程,通过提供各种自动配置的starter包,Spring Boot使得项目配置变得简单快速,感兴趣的朋友一起看看吧
    2024-02-02
  • Java中常用队列的使用解读

    Java中常用队列的使用解读

    这篇文章主要介绍了Java中常用队列的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • Mybatis 缓存原理及失效情况解析

    Mybatis 缓存原理及失效情况解析

    这篇文章主要介绍了Mybatis 缓存原理及失效情况解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • MySQL+SSM+Ajax上传图片问题

    MySQL+SSM+Ajax上传图片问题

    本文主要介绍了MySQL+SSM+Ajax上传图片问题。具有很好的参考价值。下面跟着小编一起来看下吧
    2017-03-03
  • SpringBoot实现登录拦截的示例代码

    SpringBoot实现登录拦截的示例代码

    如果我们不进行登录拦截的话,即使我们跳过登录页面直接去访问任意一个页面也能访问成功,那么登录功能就没有意义,同时也会存在安全问题,本文就来介绍一下SpringBoot登录拦截,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09

最新评论