甩掉手动赋值!MyBatis-Plus 自动填充实战秘籍

MyBatis-Plus自动填充字段 MyBatis-Plus 提供了一个便捷的自动填充功能,用于在插入或更新数据时自动填充某些字段,如创建时间、更新时间等。以下是如何使用这一功能的详细说明。自动填充功能通过实现 MetaObjectHandler 接口来实现。你需要创建一个类来实现这个接口,并在其中定义插入和更新时的填充逻辑。 阅读详情

01 引言

在数据库设计中,常常有一些字段每次都需要赋值,如创建时间、更新时间、操作人、删除标识等。很多时候,为了赶项目匆匆的赋值了一些业务字段,而漏掉了这些字段,导致查询问题的时候,时间点或者操作人对不上,加大了定位问题的难度。

有没有框架级的技术,全局处理这样的统一字段呢?当然有。

Mybatis-Plus自动填充技术帮我们解决问题。

02 自动填充实现

使用Mybtis-Plus之前,我们需要简单的搭建环境。

2.1 Mybatis-Plus 简单搭建

Maven

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>${mybatis-plus.version}</version>
</dependency>
<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <scope>runtime</scope>
</dependency>

配置

# 数据源
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test
spring.datasource.username=root
spring.datasource.password=root

# 日志实现
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
# 开启驼峰匹配
mybatis-plus.configuration.map-underscore-to-camel-case=true
# 配置全局数据库主键
mybatis-plus.global-config.db-config.id-type=auto

启动类增加Mapper扫描

@MapperScan("com.simonking.boot.mybaits.mapper")

实体

@Data
@TableName("user_info")
public class UserInfo {
    
    /**
     * 主键ID
     **/
    @TableId
    private Integer id;

    /**
     * 姓名
     **/
    private String name;

    /**
     * 年龄
     **/
    private Integer age;


    /**
     * 性别
     **/
    private String sex;

    /**
     * 工作
     **/
    private String job;

    /**
     * 生日
     **/
    private LocalDateTime birthday;

    /**
     * 创建时间
     **/
    private LocalDateTime createdTime;

    /**
     * 更新时间
     **/
    private LocalDateTime updateTime;
}

继承BaseMapper

public interface UserInfoMapper extends BaseMapper<UserInfo> {

}

到这里,Mybatis-Plus就搭建好了,可以注解注入xxxMapper调用方法了。

2.2 标记自动填充的字段

在实体类中,你需要使用 @TableField 注解来标记哪些字段需要自动填充,并指定填充的策略。

@Data
@TableName("user_info")
public class UserInfo {
    
    // 其他字段...

    /**
     * 创建时间
     **/
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createdTime;

    /**
     * 更新时间
     **/
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
}

FieldFill填充的枚举:

public enum FieldFill {
    DEFAULT,       // 默认不处理
    INSERT,        // 插入填充字段
    UPDATE,        // 更新填充字段
    INSERT_UPDATE  // 插入和更新填充字段
}

2.3 实现MetaObjectHandler

创建一个类来实现 MetaObjectHandler 接口,并重写 insertFill 和 updateFill 方法。并确保实现类被Spring管理,可以通过 @Component 或 @Bean 注解来实现。

@Slf4j
@Component
public class AutoFillMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("insertFill 开始自动填充......");
        this.strictInsertFill(metaObject, "createdTime", LocalDateTime.class, LocalDateTime.now());
        this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("updateFill 开始自动填充......");
        this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
    }
}

2.4 测试

 @Test
void contextLoads01() {
    UserInfo userInfo = new UserInfo();
    userInfo.setName("test");
    userInfo.setAge(18);
    userInfoMapper.insert(userInfo);
}

从运行结果来看,cteated_time和update_time已经被赋值了。

2.5 思考

这种全局的自动填充有什么问题呢?

先看截图:

这里填充的时候,需要指定字段的名称。但是如果因为开发人员定义错字段,如update_time -> updated_time等,这里就需要穷举所有的字段。

有人可能说是开发规范的问题,的确是。但是这种问题确实有点别扭。

能不能通过注解字段指定别名,统一自动赋值的字段呢?官方暂时不支持这种方式。

03 实现原理

自动赋值的的触发机制是如何实现的呢?第一反应,应该是使用了Mybatis的拦截器插件,细看了之后,并不是。我们一起来看看。

Mybatis-Plus自动填充调用MetaObjectHandler,涉及了两个的类:

  • com.baomidou.mybatisplus.core.MybatisParameterHandler

3.1 MybatisParameterHandler

com.baomidou.mybatisplus.core.MybatisParameterHandler是对Mybaits原生的org.apache.ibatis.scripting.defaults.DefaultParameterHandler的增强。DefaultParameterHandler是Mybatis处理SQL参数的核心类,负责:

  • 将 Java 对象转换为 JDBC 参数
  • 设置 PreparedStatement 的参数值
  • 处理类型转换器(TypeHandler)

MybatisParameterHandler自然也就具备了这些功能。构造函数的功能:

我们从源码中可以看到,在创建MybatisParameterHandler对象的时候,就会根据sqlCommandType执行insertFill()还是updateFill()。

3.2 实例化

我们来看看org.apache.ibatis.executor.parameter.ParameterHandler是怎么实例化的:

04 小结

上面就是Mybatis-Plus自动填充的实现和源码分析,下一期,我们将自己通过拦截器或者注解的方式,实现属于我们自己的自动填充的功能。

mybatis-plus自动填充 在项目开发中,我们会发现有一些数据库表字段是每个表都有的,在之前针对这些字段我们的目前的处理方式就是 增加或者修改的时候一个一个的去赋值,如果都按这样的方法进行操作的话,那我们就需要在每个业务方法中进行操作,这样会显得我们的代码过于冗余、繁琐。1、实现元对象处理器接口:com.baomidou.mybatisplus.core.handlers.MetaObjectHandler。4、字段必须声明TableField注解,属性fill选择对应策略,该声明告知Mybatis-Plus需要预留注入SQL字段。 阅读详情

相关推荐

【项目实战】使用MyBatis-Plus的自动填充功能

Mybatis Plus提供了自动填充功能,可以在插入和更新操作时自动填充一些公共字段,如创建时间、更新时间、创建人、更新人等。这样可以减少代码冗余,提高开发效率。需要注意的是,自动填充功能只会在实体类中存在对应字段的情况下才会生效。如果实体类中没有对应字段,自动填充功能会被忽略。

奶爸的编程之路,也就一周冷个三天 3340

MyBatis-Plus 自动填充

MyBatis-Plus 提供的自动填充功能,可以在数据库插入或更新时,自动为指定的字段设置值,而不需要每次手动传递。

Flying_Fish_roe的博客 4074

Spring Boot进阶(03):【实战教程】MyBatis-Plus秒级实现字段自动填充,让你的代码更优雅!

如何使用MyBatis-Plus提供的@TableField注解实现字段自动填充?这你若不会,还不点进来瞅瞅!或许就捡到宝啦。

**My Coding Family** 1万+

通过MybatisPlus实现字段自动填充功能

通过MybatisPlus实现字段自动填充功能

weixin_67727883的博客 1758

STM32+W5500实战:5分钟搞定FreeModbus TCP移植(附完整代码)

本文详细介绍了如何在STM32微控制器上,结合W5500以太网芯片,快速完成FreeModbus TCP协议栈的移植,构建稳定可靠的工业级Modbus TCP服务器。内容涵盖硬件连接、软件架构、驱动适配、核心移植代码实现及调试优化技巧,旨在提供可直接应用于实际项目的完整解决方案。

life6的博客 879

Windows下Delft3D安装全攻略:从申请许可到编译运行(避坑指南)

本文详细解析了Windows系统下Delft3D的完整安装流程,涵盖环境准备、许可获取、源码编译到性能调优的全过程。针对中国用户常见的网络问题和系统兼容性痛点,提供了经过验证的解决方案,特别强调Intel Fortran编译器匹配、环境变量配置等关键步骤,帮助水利工程师高效完成这一水动力学模拟工具的部署。

weixin_28736355的博客 550

MyBatis-Plus实现自动字段填充

使用Mybatis-plus实现数据保存和更新前的通用字段自动赋值

Glubin的博客 2524

微信小程序网关逆向分析:从协议、签名到会话管理的安全架构剖析

在现代Web与移动应用开发中,API网关作为客户端与后端服务之间的关键通信枢纽,承担着协议转换、流量调度、安全防护与性能优化等核心职责。其工作原理通常涉及统一的请求路由、身份认证、参数校验与响应聚合。从技术价值看,深入理解网关机制不仅能帮助开发者构建更健壮、可扩展的微服务架构,还能为安全评估、性能调优与故障排查提供基础。在移动生态如微信小程序中,网关设计尤为关键,它需要处理微信特有的登录态、数据加密与防重放攻击等安全需求。本文聚焦于微信小程序网关的逆向分析方法,通过结合网络抓包与代码反编译技术,深入解析其通

weixin_29323493的博客 443

Mybatis-plus 自动填充 不生效或自动填充数据为null 原因及解决方案

mybatis-plus自动填充不生效 填充的数据为空 使用乐观锁自动填充失效 当字段从数据库查询出来时自动填充不生效问题

五更依旧朝花落的博客 2万+

脑电分析中的频谱特征提取 —— 从理论到实践

本文系统介绍了脑电信号(EEG)频谱特征提取方法及其应用。EEG信号通过频谱分析可分为Delta、Theta、Alpha、Beta和Gamma等具有明确生理意义的频段。文章详细讲解了功率谱密度、频带功率、相对功率、频谱熵等关键特征的计算方法,并提供了Python实现示例,包括模拟数据和真实CHB-MIT癫痫数据集的处理流程。这些频谱特征在脑机接口、情绪识别、疲劳监测和癫痫检测等领域具有重要应用价值。文章强调频谱特征结合时域和非线性特征可提升分析效果,为EEG研究提供了实用指导。

qq_32516809的博客 1442

大连理工大学中文情感词汇本体库(含情绪分析代码)

中文文本数据的情绪计算昨天如何对微博推文进行情绪分析(细粒度情感分析)介绍了英文的NRC情绪词典。虽然支持中文,但由于制作问题,导致并不完全适应中文场景。今天介绍大连理工大学中文情感...

大邓和他的Python 4万+

MyBatis-Plus 自动赋值实体字段

本文深入解析MyBatis-Plus自动赋值实体字段的实现与应用。主要内容包括:1)自动填充的四大场景(时间戳、用户信息等)及四种填充策略;2)关键注解@TableField和@TableId的配置方法;3)通过MetaObjectHandler实现自动填充的完整代码示例;4)不同填充策略的行为对比表格。文章还总结了自动赋值的三大优势,并提供了常见问题解决方案和最佳实践建议,帮助开发者提升效率并保证数据一致性。

一碗黄焖鸡三碗米饭的博客 1285

ESP32-P4实战:LVGL V9.4 PPA加速配置与性能对比

本文详细介绍了如何在ESP32-P4平台上配置LVGL V9.4的PPA硬件加速功能,通过启用PPA加速显著提升图形处理性能并降低CPU占用率。文章包含环境准备、配置步骤、性能对比及常见问题解决方案,帮助开发者高效利用ESP32-P4的PPA加速器优化嵌入式GUI应用。

rice5的博客 1193

MyBatis-Plus 自动填充功能

通过 MyBatis-Plus 提供的自动填充功能,开发者可以更加高效地进行数据处理,减少代码冗余,并确保系统字段的一致性和正确性。操作时,某些字段可以由 MyBatis-Plus 自动赋值,无需开发者手动提供。该功能可以在执行插入或更新操作时,自动为某些字段赋值,免去手动设置这些字段的麻烦。如果需要自定义填充规则,例如在创建时使用自定义的时间格式或设置特定的字段值,可以在。字段的自动填充,帮助开发者在处理数据时更加高效,减少人为错误。字段通常在数据更新时自动填充,记录数据最后一次修改的时间。

秋元的博客 1381

在MATLAB中将C语言代码转化为可执行的mexw64文件

这样,您可以将高效的C语言算法集成到MATLAB环境中,以便更好地利用MATLAB的功能和特性。请记住,在使用mex转换C语言代码之前,您需要正确编写和测试C语言代码,并确保它与MATLAB的mex接口兼容。MATLAB是一种功能强大的数值计算软件,它提供了一个机制,可以将C语言代码转化为MATLAB可执行的mexw64文件。在上述命令中,"-output"选项指定生成的mex文件的名称,"myfunction"是您选择的名称,"myfunction.c"是要编译的C语言源文件。步骤1:编写C语言代码。

CodeRoarX的博客 1429

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

MyBatis-Plus 自动填充功能详解

创建一个类实现// 交给 Spring 管理,让 MyBatis-Plus 能扫描到 @Component public class MyMetaObjectHandler implements MetaObjectHandler {/*** 插入操作时的填充逻辑。

2302_79926174的博客 1465

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

MyBatis-Plus 自动填充:优雅实现创建/更新时间自动更新!

MyBatis-Plus 自动填充是指在执行insert或update操作时,自动为某些字段设置值,而无需手动在代码中进行赋值。🎉

qq_56158663的博客 3500

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Spring Boot MyBatis-Plus自动填充

通过注解和自定义,你可以轻松实现MyBatis-Plus的字段自动填充。关键在于理解不同填充方法的适用场景,并注意填充触发的条件。以下代码中:-- 文件资源begin[file_id] [int] IDENTITY(1,1) NOT NULL, -- 文件唯一id[file_name] [nvarchar] (255) NOT NULL, -- 文件名[file_extension] [nvarchar] (20) default '' NULL, -- 文件后缀。

BillKu的博客 855

MyBatis-Plus自动填充功能

mysql字段自动填充

m0_70050614的博客 4034

Mybatis-Plus 探秘:createTime 为 NULL?一文搞定优雅的自动填充!

摘要: MyBatis-Plus自动填充失效?createTime为NULL的常见问题解析!本文揭示了@TableField注解仅是声明,实际需要实现MetaObjectHandler接口来执行填充操作。通过创建MyMetaObjectHandler类并标注@Component,在insertFill和updateFill方法中设置LocalDateTime.now(),即可解决字段自动填充问题。两步配置后,重启应用即可看到日志中自动填充生效,数据库时间字段被正确更新。掌握"声明+实现"

小丁的博客 1217

MyBatis-Plus字段自动填充功能,update 方法导致自动填充失败问题

在使用 MyBatis-Plus 时,自动填充机制通过实现 MetaObjectHandler 接口来统一处理诸如 UPDATER 和 UPDATE_DATE 等公共字段。但在使用 update 方法时,不同的用法可能导致自动填充机制失效。

weixin_66212050的博客 1485

Mybatis-Plus实现公共字段自动赋值

目录 1 mybatis-plus实现自动填充指定字段 1.1 需要修改的字段在模型类上添加 1.2 新建一个MetaObjectHandler的实现类 2 通用字段自动填充的最佳实践总结 2.1 调整数据库表结构 2.2 通用维护信息父类-自动赋值的字段 2.3 实体类的实现 2.4 自动赋值的规则 2.5 实现效果 1 mybatis-plus实现自动填充指定字段 首先了解MetaObjectHandler MetaObjectHandler接口是mybatisPlus为我们提供的的一个扩展接口...

赵广陆 1410

MyBatis-Plus 知识篇(3):MyBatis-Plus的逻辑删除与自动填充

本文介绍了MyBatisPlus的两个实用功能:逻辑删除和自动填充。逻辑删除通过在表中添加is_deleted字段标识记录状态,避免物理删除,通过@TableLogic注解或配置文件实现。自动填充功能通过@TableField注解和MetaObjectHandler接口,自动维护create_time和update_time字段。两者都适用于MyBatisPlus自带的SQL语句,不适用于自定义SQL。这两个功能能有效简化开发,提高数据管理的规范性和效率。

jialuosi的博客 756

mybatis-plus公共字段自动填充

1.对mybaits-plus自动生成代码模板有疑问的同学,请看我的另一篇博客 https://blog.youkuaiyun.com/qq_26182739 2.这里讲解怎么结合自动策略配置,自动填充类似于update_time,update_name,update_id这些公共字段,每次更新或者插入的 时候不用我们再进行同样的赋值操作 在自定义配置模板中加入如下代码: // 策略配置 Strat...

搬砖盖楼的博客 6389
上一篇: 深入解析 Spring SpEL:SpelExpressionParser 的使用与实践
下一篇: 手撕「字段自动填充」的2种方案
智_永无止境
博客等级 码龄10年 803粉丝 406原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智_永无止境

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值