MyBatisPlus插入更新数据时通用字段自动赋值

MyBatis-Plus,MetaObjectHandler没生效,完美解决 若依框架集成mybatis-plus,自动填充字段不生效 阅读详情

1、创建时间和更新时间在数据库表层面就可以解决

`create_time` datetime DEFAULT NULL CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',

2、创建人和更新人赋值操作

MetaObjectHandler接口是mybatisPlus为我们提供的的一个扩展接口,我们可以利用这个接口在我们插入或者更新数据的时候,为一些字段指定默认值。
使用场景:公共字段填充等,如updateTime、createTime、createUser、updateUser等公共字段多的填充。

@Data
public class Employee implements Serializable {

private static final long serialVersionUID = 1L;

private Long id;

private String username;

@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;

@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;

@TableField(fill = FieldFill.INSERT)
private Long createUser;

@TableField(fill = FieldFill.INSERT_UPDATE)
private Long updateUser;

}

2、自定义元对象处理器类,实现metaObjecthandler接口,重写insertFill、updateFill方法;
1)在每次执行插入和修改操作时,会执行insertFill,updateFill方法;
2)setValue(String name,Object value) : 设置公共字段填充值,第一个参数值name与实体字段要相同

import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.chinaunicom.common.core.domain.BaseEntity;
import com.chinaunicom.common.exception.ServiceException;
import com.chinaunicom.common.utils.SecurityUtils;
import org.apache.ibatis.reflection.MetaObject;

import java.util.Date;

/**
 * MyBatis Plus 元对象处理器配置(插入或修改时自动填充)
 *
 * @author Charles7c
 * @since 2022/12/22 19:52
 */
public class MyBatisPlusMetaObjectHandler implements MetaObjectHandler {

    /** 创建人 */
    private static final String CREATE_USER = "createBy";
    /** 创建时间 */
    private static final String CREATE_TIME = "createTime";
    /** 修改人 */
    private static final String UPDATE_USER = "updateBy";
    /** 修改时间 */
    private static final String UPDATE_TIME = "updateTime";

    /**
     * 插入数据时填充
     *
     * @param metaObject
     *            元对象
     */
    @Override
    public void insertFill(MetaObject metaObject) {
        try {
            if (null == metaObject) {
                return;
            }

            String createUser = SecurityUtils.getUsername();
            Date createTime = new Date();
            if (metaObject.getOriginalObject() instanceof BaseEntity) {
                // 继承了 BaseDO 的类,填充创建信息
                BaseEntity baseDO = (BaseEntity)metaObject.getOriginalObject();
                baseDO.setCreateBy(ObjectUtil.defaultIfNull(baseDO.getCreateBy(), createUser));
                baseDO.setCreateTime(ObjectUtil.defaultIfNull(baseDO.getCreateTime(), createTime));
            } else {
                // 未继承 BaseDO 的类,如存在创建信息则进行填充
                this.fillFieldValue(metaObject, CREATE_USER, createUser, false);
                this.fillFieldValue(metaObject, CREATE_TIME, createTime, false);
            }
        } catch (Exception e) {
            throw new ServiceException("插入数据时自动填充异常:" + e.getMessage());
        }
    }

    /**
     * 修改数据时填充
     *
     * @param metaObject
     *            元对象
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        try {
            if (null == metaObject) {
                return;
            }

            String updateUser = SecurityUtils.getLoginUser().getUsername();
            Date updateTime = new Date();
            if (metaObject.getOriginalObject() instanceof BaseEntity) {
                // 继承了 BaseDO 的类,填充修改信息
                BaseEntity baseDO = (BaseEntity)metaObject.getOriginalObject();
                baseDO.setUpdateBy(updateUser);
                baseDO.setUpdateTime(updateTime);
            } else {
                // 未继承 BaseDO 的类,根据类中拥有的修改信息进行填充,不存在修改信息不进行填充
                this.fillFieldValue(metaObject, UPDATE_USER, updateUser, true);
                this.fillFieldValue(metaObject, UPDATE_TIME, updateTime, true);
            }
        } catch (Exception e) {
            throw new ServiceException("修改数据时自动填充异常:" + e.getMessage());
        }
    }

    /**
     * 填充字段值
     *
     * @param metaObject
     *            元数据对象
     * @param fieldName
     *            要填充的字段名
     * @param fillFieldValue
     *            要填充的字段值
     * @param isOverride
     *            如果字段值不为空,是否覆盖(true 覆盖、false 不覆盖)
     */
    private void fillFieldValue(MetaObject metaObject, String fieldName, Object fillFieldValue, boolean isOverride) {
        if (metaObject.hasSetter(fieldName)) {
            Object fieldValue = metaObject.getValue(fieldName);
            setFieldValByName(fieldName, null != fieldValue && !isOverride ? fieldValue : fillFieldValue, metaObject);
        }
    }
}
mybatisPlus之自动填充工具MetaObjectHandler使用demo及注意点 文章目录一. 使用场景二. 使用姿势1.实现MetaObjectHandler接口2. 实体类上添加注解三. 不生效的场景1. 试试2. dad 一. 使用场景 MetaObjectHandler是元对象字段填充控制器抽象类,实现公共字段自动写入。 比如通常,我们在建表时,会设置几个公共字段:创建人(creator)、更新人(uptater)、创建时间(create_time)、更新时间(update_time)。 每次将实体对象新增入库时,都要设置创建人和创建时间;每次更新实体对象时,都要设置更新人和更新 阅读详情

相关推荐

Mybatisplus实现MetaObjectHandler接口自动更新创建时间更新时间

踩坑: 直接实现该接口,发现进入该类后的entity已经重新处理updateTime了,但是更新数据库的时候,却不带updateTime更新。 原因: 由于对该接口等认识不足导致。 解决方案: 实体类中需要添加注解:fill = FieldFill.INSERT_UPDATE 代码: /** * 更新时间 */ @TableField(valu...

梦游小草的博客 1万+

metaObjecthandler 的基本理解与使用

metaObjecthandler:元数据对象处理器 MetaObjectHandler接口是mybatisPlus为我们提供的的一个扩展接口,我们可以利用这个接口在我们插入或者更新数据的时候,为一些字段指定默认值。 使用场景:公共字段填充等,如updateTime、createTime、createUser、updateUser等公共字段多的填充。

fengzheng1232的博客 9370

使用Mybatis-Plus实现往数据库种插入数据时指定字段的数据自动填充

问题场景 在数据库的插入或者更新操作时,有时候需要自动填充。考虑一个场景,数据库种有两个字段分别是“create_time”和“update_time”我们需要在插入数据的时候自动记录插入数据的时间,也需要在对数据有任何更新操作时,自动记录更新数据的时间。 上面举出了最常用的自动填充的场景。下面的解决方案也是针对这个场景,其他的场景可以用同样的思路解决。 解决方案 思路分析:思考如何自动填充的问题需要具体解决如下几个问题: 那些字段需要自动填充? 这些字段在什么时候自动填充?(第一次插入数据的时候

Java技术工坊 7269

MetaObjectHandler

MetaObjectHandler

qq_43960768的博客 1万+

MyMetaObjectHandler 没有进入,如何解决?

确保已被 Spring 容器管理(@Component或手动注入)。确认实体类字段已正确设置自动填充注解。使用日志或断点调试,确认insertFill和updateFill方法是否被调用。如果这些检查都完成,问题依然存在,可以提供更多的代码细节,我可以帮助进一步分析问题。希望如上措施及解决方案能够帮到有需要的你。

**My Coding Family** 1064

如何用 OBProxy 实现 OceanBase 的最佳路由策略

本文基于业务中一类常见的路由问题展开,对OceanBase的路由功能及对应配置项做详细介绍,指导用户在业务实践中如何正确的配置路由策略及快速排查路由问题

OceanBase分布式数据库的博客 1679

Mybatis plus通用字段自动填充的最佳实践总结

在进行持久层数据维护(新增或修改)的时候,我们通常需要记录一些非业务字段,比如:create_time、update_time、update_by、create_by等用来维护数据记录的创建时间、修改时间、修改人、创建人等信息。通常情况下我们需要对这些字段进行手动赋值。赋值的过程也比较冗余,都是重复操作。 通常是为create_time赋值为系统的当前时间、update_time赋值为系统修改操作执行时的当前时间。 create_by(创建人)、update_by(修改人)赋值为当前的登录用户的用户名 xx

xiaochengxuyuan1的博客 317

Unity ProBuilder(自己创建斜面、拐角)

ProBuilder基础实例

weixin_56537692的博客 1551

mybatisplus 通用字段自动赋值与更新

entity 中对应的字段上加入@tableField(fill=FieldFill.INSERT)或者@tableField(fill=FieldFill.INSERT_UPDATE)default current_timestamp on update current_timestamp 修改的时候更新时间。实现metaobjecthandler中的insertFill 和 updateFill 方法装载需要保存和更新的数据。default current_timestamp 插入的时候获取当前。

caoyanzhi的博客 486

手把手教你用GD32F407VET6的EXMC驱动外部SRAM,搞定大内存需求

本文详细介绍了如何使用GD32F407VET6的EXMC外设驱动外部SRAM,解决嵌入式开发中的大内存需求问题。通过硬件连接方案、EXMC时序配置与初始化步骤,以及软件集成与内存管理技巧,帮助开发者快速实现内存扩展。特别适合需要处理图形显示缓冲、音频处理等大内存场景的GD32F407开发者。

weixin_30752699的博客 345

激光可燃气体传感器:核心技术环节分析

激光可燃气体传感器核心技术涵盖七个维度:1)TDLAS光谱吸收与调制技术(检测下限ppm级);2)DFB激光器与双闭环温控系统(波长稳定性±0.0036nm);3)微弱信号处理技术(信噪比提升60dB);4)环境补偿算法(温压补偿误差<±1%);5)本质安全防爆设计(ExiaIICT4Ga等级);6)智能边缘计算(STM32L476芯片);7)多重性能验证(响应时间<1秒)。通过微型化、多气体检测等创新,该技术已在工业安全等领域替代传统方案,实现高精度检测。(149字)

上市公司前技术负责人,20 年软硬件深耕 + 百人研发团队管理经验,名校理工科背景加持。从技术攻坚到团队掌舵,沉淀海量项目实战与管理心得,专注分享软硬件干货、疑难问题解决方案,既是靠谱知识传播者,也盼链接优质项目共成长。 1036

MybatisPlus通用增强BaseMapper,新增通过ID更新实体全部字段或只更新非空字段方法

作用:继承MybatisPlus原有的BaseMapper,功能增强。比如:批量查询、批量更新、查询单个或多个VO对象…有了这些方法Service层就不需要去继承MybatisPlus的了,减少代码侵入。注意下面三个方法:这3个方法不受MybatisPlus全局配置文件的影响,该值系统默认是,当我们在使用的时候,如果实体的字段是null值,不会去更新数据库,但有时候这不是我们想要的,需要把数据库字段覆盖为空。用这3个方法就能非常容易且灵活的实现,不受配置文件和实体字段注解的影响,非常自由灵活。

Boven 1702

WRF进阶:定制Vtable文件解析非标准气象数据源——以ERA5-Land土壤湿度为例

本文详细介绍了如何为WRF模式定制Vtable文件,以解析非标准气象数据源ERA5-Land的土壤湿度数据。通过剖析GRIB文件结构、详解Vtable编写逻辑与语法,并提供了从数据验证到metgrid配置的完整实战流程,帮助用户突破标准数据源限制,实现高精度陆面过程模拟。

o4p5q6r7s的博客 390

mysql 自动填充字段_在MyBatisPlus中使用@TableField完成字段自动填充的操作

场景官方文档:字段注解 @TableFieldcom.baomidou.mybatisplus.annotations.TableField值描述value字段值(驼峰命名方式,该值可无)update预处理 set 字段自定义注入condition预处理 WHERE 实体条件自定义运算规则el详看注释说明exist是否为数据库表字段( 默认 true 存在,false 不存在 )strategy字...

weixin_34184682的博客 3770

UE5实现物体高亮描边效果(含UE相关源码浅析)

UE5实现物体高亮描边效果

专注GIS开发 7334

【RT-DETR涨点改进】全网独家-特征融合改进篇 | AAAI 2025 顶会| 高效涨点,RT-DETR利用CDFA对比度特征聚合模块,适用于目标检查(全网独家创新)

本文提出了一种基于CDFA模块的多级特征融合优化RT-DETR模型,用于解决医学图像分割中的软边界模糊、小目标和共现现象等问题。CDFA模块通过对比度特征聚合、局部特征增强和多级注意力机制,有效提升模型性能。研究提供了三种改进方案(rtdetr-r18/y50/l-CDFA),并在多个医学数据集上验证了其有效性。核心创新包括语义信息解耦、对比驱动特征融合和尺寸感知解码器。实验结果表明,该方法在分割精度和鲁棒性方面达到SOTA水平。

Ai缝合怪、助力小伙伴高效发论文 509

mybatisplus自动填充值:完成自动填充更新时间和创造时间,以及坑

一般实体类最后都会带有createTime和updateTime但我希望让它是自动更新的,由于mybatisplus的sql是看不到的, 但又不想自己重写sql。于是解决方法来了!用它自带的字段自动填充功能! 实体类: @Data @TableName("mmall_user") public class User { @TableId private int id; pr...

weixin_44841849的博客 1万+

你的小龙虾 OpenClaw 还很笨?快给它装上这几个核心技能(OpenClaw 必装skills整理)

🦞 刚装小龙虾OpenClaw? 本文分享一些OpenClaw必装技能,从视觉理解到智能学习,让它从“会聊天”变“会干活” 🚀

XiaoqiangClub的博客 868

mybatisPlus属性自动填充配置之MetaObjectHandler接口实战

前言:在我们向数据库插入一条数据的时候,少不了一些向createTime、updateTime此类字段,每次插入的数据都要设置这些个值,很烦,通过实现MetaObjectHandler接口重写insertFill、updateFill方法可以帮你摆脱烦恼 本文概括MetaObjectHandler介绍1:编写MetaObjectHandler 实现类2:实体类上边加上@TableField(fill = FieldFill.INSERT_UPDATE)注意点小节代码链接 MetaObjectHandle.

风团团 3万+

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

MybatisPlus_插入或更新数据时自动填充属性

二.自定义实现类MyMetaObjectHandler 运行效果 第六行为新插入的数据进行一次更新,将年龄设置为6岁:可以看到update_time字段发生了改变 在创建数据库字段时,选择类型datetime,填写默认值CURRENT_TIMESTAMP(切记创建时填写),并为update_time勾选根据当前时间戳更新.....................

Mudrock__的博客 2883

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

MyBatisPlus通过@TableField的fill属性和实现MetaObjectHandler完成自动填充字段,更新字段失败bug修复

MyBatisPlus的@TableField的fill属性和实现MetaObjectHandler接口自动填充字段值,更新字段失败bug修复

Plenilune_yj的博客 2450

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

mybatisPlus中的field-strategy(字段更新插入策略):null值插入和更新问题

目录mybatisPlus中null值更新和插入问题实际项目解决方法示例field-strategy字段更新插入策略介绍枚举类FieldStrategy源码枚举类字段简介 mybatisPlus中null值更新和插入问题 配置mybatisPlus的项目中,默认进行了不是全量更新的策略:NOT_NULL。 即在利用updateWrapper更新时,会做null判断,如果传参数为null,就不会更新。 在实际项目需求中可能配置更新策略为:NOT_NULL,但是某些场景更新时需要插入这个null值进行更新。如何

weixin_36894490的博客 1万+

【SpringBoot+MyBatisPlus】利用线程特性与ThreadLocal来解决公共字段自动填充问题

每一次在Controller层中封装改动数据的方法时都要重新设置一些共性字段,显得十分冗余,为了解决此问题也是在项目中第一次利用到线程,总的来说还是让我眼前一亮,也开阔了视野,对以后的开发都有深远的意义!

懒羊羊的博客 5550

MybatisPlus实现时间字段自动添加及更新

MybatisPlus实现时间字段自动添加及更新 引入MybatisPlus 在实体类中需要自动添加时间的字段使用@TableField注解,表示这个字段是在插入时填充的 @TableField(fill = FieldFill.INSERT) @ApiModelProperty(value = "留言时间") private Date createdDate; FieldFill枚举类源码 public enum FieldFill { /** * 默认不处理 *

Cry4TheMoon的博客 3718

MyBatisPlus中使用 @TableField完成字段自动填充

需求:平时在做增删改查时,创建人,创建时间,更新人,更新时间,版本号这些字段是都有的,每次都写很麻烦,现在可以通过配置就可以不用管这些字段,写入表时这些字段自动填充。 jar依赖 gradle compile 'com.baomidou:mybatis-plus-boot-starter:3.1.1' maven <dependency> <groupId&...

C18298182575的博客 3万+

MybatisPlus实现插入或更新数据时自动生成时间戳

两步实现MybatisPlus插入或更新数据时,自动生成时间戳功能

weixin_43830765的博客 6821
上一篇: 5、SpringCloud - Nacos配置中心、命名空间
下一篇: 3、使用renren-generator生成基本代码
程序员老石
博客等级 码龄8年 286粉丝 162原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值