MyBatis-Plus 元对象处理器 @TableField注解 反射动态赋值 实现字段自动填充
目录
🌰 举个直观例子
🛠️ 核心作用原理
📜 代码级工作流程
📜 完整代码
🔍 关键概念拆解
⚠️ 常见问题排查
🌟 设计意义
🌰 举个直观例子
package work.dduo.ans.domain;import com.baomidou.mybatisplus.annotation.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.io.Serializable;
import java.util.Date;/*** * @TableName t_visit_log*/
@TableName(value ="t_visit_log")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class TVisitLog implements Serializable {/*** id*/@TableId(type = IdType.AUTO)private Integer id;/*** 访问ip*/private String ipAddress;/*** 访问地址*/private String ipSource;/*** 操作系统*/private String os;/*** 访问时间* 使用mybatis-plus的元对象处理器自动填充*/@TableField(fill=FieldFill.INSERT)private Date createTime;private static final long serialVersionUID = 1L;}
假设你每次保存订单时都要记录 "订单创建时间":
- 没有元对象处理器:每次插入数据都要手动写
order.setCreateTime(new Date()) - 有了元对象处理器:你只需专注业务逻辑,框架自动帮你填充这个时间
🛠️ 核心作用原理
- 拦截数据库操作
MyBatis-Plus 在执行insert()或update()操作时,会触发元对象处理器。 - 通过注解识别目标字段
字段上的@TableField(fill = FieldFill.INSERT)注解会告诉处理器:"这个字段需要自动填充"。 - 反射动态赋值
处理器利用反射机制,通过MetaObject对象直接操作实体类的字段值(无需手动调用 set 方法)。
📜 代码级工作流程
以你的 createTime 字段为例:
// 1. 你的实体类标记了自动填充
public class TVisitLog {@TableField(fill = FieldFill.INSERT)private Date createTime;
}// 2. 插入操作时自动触发
TVisitLog log = new TVisitLog();
visitLogMapper.insert(log); // ← 这里自动填充 createTime// 3. 处理器内部执行(伪代码)
class MyMetaObjectHandler {void insertFill() {if (字段有 @TableField(fill=INSERT)) {用反射给字段赋值 new Date()}}
}
📜 完整代码
package work.dduo.ans.handler;import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;import java.util.Date;@Component
public class MyMetaObjectHandler implements MetaObjectHandler {@Overridepublic void insertFill(MetaObject metaObject) {this.strictInsertFill(metaObject, "createTime", Date.class, new Date());}@Overridepublic void updateFill(MetaObject metaObject) {this.strictInsertFill(metaObject, "updateTime", Date.class, new Date());}}
🔍 关键概念拆解
| 概念 | 说明 |
| MetaObject | 对实体类的动态包装器,提供反射操作字段的能力(类似一个能透视对象内部结构的工具) |
| FieldFill | 填充策略枚举,包含 INSERT(插入时填充)、UPDATE(更新时填充)等 |
| strictInsertFill | 严格模式填充方法,确保字段存在且类型匹配 |
⚠️ 常见问题排查
如果自动填充失效,检查:
- 处理器类是否添加了
@Component注解 - 实体类字段名与处理器中写的名称是否完全一致(包括大小写)
- 是否在主启动类的扫描范围内(位于同一包或子包)
- 数据库字段是否有默认值冲突(建议同时设置数据库默认值
CURRENT_TIMESTAMP)
🌟 设计意义
通过元对象处理器,实现了:
✅ 业务代码与非业务逻辑解耦(时间记录等通用操作集中管理)
✅ 消除重复代码(避免每个插入操作都写 setCreateTime)
✅ 保证数据一致性(比如强制所有表统一使用同一时间生成规则)
相关文章:
MyBatis-Plus 元对象处理器 @TableField注解 反射动态赋值 实现字段自动填充
目录 🌰 举个直观例子 🛠️ 核心作用原理 📜 代码级工作流程 📜 完整代码 🔍 关键概念拆解 ⚠️ 常见问题排查 🌟 设计意义 🌰 举个直观例子 package work.dduo.ans.domain;import com.b…...
ISP 常见流程
1.sensor输出:一般为raw-OBpedestal。加pedestal避免减OB出现负值,同时保证信号超过ADC最小电压阈值,使信号落在ADC正常工作范围。 2. pedestal correction:移除sensor加的基底,确保后续处理信号起点正确。 3. Linea…...
Python Cookbook-2.27 从微软 Word 文档中抽取文本
任务 你想从 Windows 平台下某个目录树中的各个微软 Word 文件中抽取文本,并保存为对应的文本文件。 解决方案 借助 PyWin32 扩展,通过COM 机制,可以利用 Word 来完成转换: import fnmatch,os,sys,win32com.client wordapp w…...
java数据结构_Map和Set(一文理解哈希表)_9.3
目录 5. 哈希表 5.1 概念 5.2 冲突-概念 5.3 冲突-避免 5.4 冲突-避免-哈希函数的设计 5.5 冲突-避免-负载因子调节 5.6 冲突-解决 5.7 冲突-解决-闭散列 5.8 冲突-解决-开散列 / 哈希桶 5.9 冲突严重时的解决办法 5. 哈希表 5.1 概念 顺序结构以及平衡树中&#x…...
基于SpringBoot的“数据驱动的资产管理系统站”的设计与实现(源码+数据库+文档+PPT)
基于SpringBoot的“数据驱动的资产管理系统站”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 局部E-R图 系统登录界…...
excel 斜向拆分单元格
右键-合并单元格 右键-设置单元格格式-边框 在设置好分割线后,你可以开始输入文字。 需要注意的是,文字并不会自动分成上下两行。 为了达到你期望的效果,你可以通过 同过左对齐、上对齐 空格键或使用【AltEnter】组合键来调整单元格中内容的…...
深入理解推理语言模型(RLM)
大语言模型从通用走向推理,万字长文解析推理语言模型,建议收藏后食用。 本文基于苏黎世联邦理工学院的论文《Reasoning Language Models: A Blueprint》进行整理,你将会了解到: 1、RLM的演进与基础:RLM融合LLM的知识广…...
2025年具有百度特色的软件测试面试题
百度业务场景 如何测试一个高并发的搜索系统(如百度搜索)?如何测试一个在线地图服务(如百度地图)?如何测试一个大型推荐系统(如百度推荐)的性能?百度技术栈 你对百度的 PaddlePaddle 框架有了解吗?如何测试基于 PaddlePaddle 的服务?如何测试百度云的 API 服务?你对…...
HOW - 在Windows浏览器中模拟MacOS的滚动条
目录 一、原生 CSS 代码实现模拟 macOS 滚动条额外优化应用到某个特定容器 二、使用第三方工具/扩展 如果你想让 Windows 里的滚动条 模拟 macOS 的效果(细窄、圆角、隐藏默认轨道)。 可以使用以下几种方案: 一、原生 CSS 代码实现 模拟 m…...
Lua | 每日一练 (5)
💢欢迎来到张胤尘的技术站 💥技术如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥 文章目录 Lua | 每日一练 (5)题目参考答案浅拷贝深拷贝使用场景…...
C# Unity 唐老狮 No.5 模拟面试题
本文章不作任何商业用途 仅作学习与交流 安利唐老狮与其他老师合作的网站,内有大量免费资源和优质付费资源,我入门就是看唐老师的课程 打好坚实的基础非常非常重要: 全部 - 游习堂 - 唐老狮创立的游戏开发在线学习平台 - Powered By EduSoho 如果你发现了文章内特殊的字体格式,…...
云原生事件驱动架构:构建实时响应的数字化神经系统
引言:重塑企业实时决策能力 Uber实现事件驱动架构升级后,实时供需匹配延迟降至8ms,动态定价策略响应速度提升1200倍。Netflix通过事件流处理实现个性化推荐,用户点击率提高34%,事件处理吞吐量达2000万/秒。Confluent基…...
Metasploit multi/handler 模块高级选项解析
multi/handler 是 Metasploit 框架中至关重要的模块,主要用于监听目标机的连接并处理来自目标的反向 shell 或会话。它可以灵活地适应不同渗透测试场景,提供高度的自定义选项以优化监听器的行为。 在 Metasploit msf6 框架中,当使用 exploit…...
WPF高级 | WPF 应用程序部署与发布:确保顺利交付到用户手中
WPF高级 | WPF 应用程序部署与发布:确保顺利交付到用户手中 一、前言二、部署与发布基础概念2.1 部署的定义与目的2.2 发布的方式与渠道2.3 部署与发布的关键要素 三、WPF 应用程序打包3.1 使用 Visual Studio 自带的打包工具3.2 使用第三方打包工具 四、发布到不同…...
Spring MVC 程序开发(1)
目录 1、什么是 SpringMVC2、返回数据2.1、返回 JSON 对象2.2、请求转发2.3、请求重定向2.4、自定义返回的内容 1、什么是 SpringMVC 1、Tomcat 和 Servlet 分别是什么?有什么关系? Servlet 是 java 官方定义的 web 开发的标准规范;Tomcat 是…...
JavaWeb后端基础(6)
主键返回 例子: /** * 新增员工数据 */ Options(useGeneratedKeys true, keyProperty "id") Insert("insert into emp(username, name, gender, phone, job, salary, image, entry_date, dept_id, create_time, update_time) " "value…...
C# Unity 唐老狮 No.4 模拟面试题
本文章不作任何商业用途 仅作学习与交流 安利唐老狮与其他老师合作的网站,内有大量免费资源和优质付费资源,我入门就是看唐老师的课程 打好坚实的基础非常非常重要: 全部 - 游习堂 - 唐老狮创立的游戏开发在线学习平台 - Powered By EduSoho 如果你发现了文章内特殊的字体格式,…...
集群、分布式与微服务架构 区别
集群、分布式与微服务架构:概念解析与核心差异 在构建现代软件系统时,集群架构、分布式系统和微服务架构是三种常见的技术方案。它们常被混淆,但各自解决的问题、设计理念和应用场景截然不同。本文将从基础概念出发,深入分析三者…...
Protocol Buffers在MCU上的nanopb介绍及使用详解
在嵌入式系统和资源受限的环境中,传统的Protocol Buffers 可能显得过于庞大。因此,nanopb 应运而生,它是一个轻量级的 Protocol Buffers 生成器,专为嵌入式系统设计c语言设计。本文将介绍如何安装和使用 nanopb,以及通…...
【Elasticsearch】自定义内置的索引生命周期管理(ILM)策略。
以下是对 Elasticsearch 官方教程《Customize built-in ILM policies》的详细解读,结合原文内容,帮助您更好地理解如何自定义内置的索引生命周期管理(ILM)策略。 --- Elasticsearch 教程:自定义内置 ILM 策略 1.背景…...
测试工程师Ai应用实战指南简例prompt
以下是一个真实具体的案例,展示测试工程师如何在不同阶段结合DeepSeek提升效率。案例基于电商平台"订单超时自动关闭"功能测试: 案例背景 项目名称:电商平台订单系统V2.3 测试目标:验证"用户下单后30分钟未支付,订单自动关闭并释放库存"功能 技术栈:…...
(十 二)趣学设计模式 之 享元模式!
目录 一、 啥是享元模式?二、 为什么要用享元模式?三、 享元模式的实现方式四、 享元模式的优缺点五、 享元模式的应用场景六、 总结 🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支…...
Trae:国内首款AI原生IDE,编程效率大提升
今年一月,在新闻上看到字节跳动面向海外市场推出了一款名为Trae的AI集成开发环境(IDE)。起初,我并未给予过多关注,因为市面上已有不少IDE集成了AI插件,功能也非常全面,而字节跳动自家的MarsCode…...
深入解析 Vue Router 的 beforeEach:功能、用法与实践指南
什么是 beforeEach?基本语法与参数解析next() 的 4 种调用方式常见使用场景与代码示例动态路由加载的实践技巧常见陷阱与避坑指南总结 1. 什么是 beforeEach? beforeEach 是 Vue Router 提供的 全局前置守卫(Global Before Guards࿰…...
RocketMQ定时/延时消息实现机制
RocketMQ 的延迟消息是其核心特性之一,允许消息在指定延迟时间后才被消费者消费。 定时消息生命周期 一、延迟消息的核心机制 RocketMQ(5.0之前) 不支持任意时间精度的延迟,而是通过预定义的 延迟级别(Delay Level&a…...
基于SpringBoot的校园二手交易平台(源码+论文+部署教程)
运行环境 校园二手交易平台运行环境如下: • 前端:Vue • 后端:Java • IDE工具:IntelliJ IDEA(可自行更换) • 技术栈:SpringBoot Vue MySQL 主要功能 校园二手交易平台主要包含前台和…...
如何快速写出国内外现状的内容并且引用对应的参考文献(近三年的论文)
解决方法: 1.首先从知网或者谷歌学术中搜索相关关键字的论文根据时间排列(最新的在前面)。然后多选选中自己想要引用的论文(一般近三年的论文要占2/3),然后导出参考文献 [19] Lu L, Jin P, Karniadakis G E. DeepONet: Learning nonlinear operators for identifying dif…...
SQL的select语句完整的执行顺序
SQL的SELECT语句的执行顺序可以用"做菜流程"来类比理解。虽然我们写SQL时按SELECT…FROM…WHERE…顺序写,但数据库执行顺序完全不同。以下是通俗易懂的讲解(附流程图和示例): 🔧 执行顺序流程图:…...
开源操作系统纷争:CentOS停服后的新战场
开源操作系统纷争:CentOS停服后的新战场 引言 2020年12月,Red Hat宣布将停止维护CentOS Linux,转而专注于CentOS Stream。这一决策在开源社区掀起轩然大波,尤其是那些依赖CentOS作为生产环境操作系统的企业和开发者们࿰…...
【知识】torchrun 与 torch.multiprocessing.spawn 的对比
转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 来自ChatGPT、DeepSeek 有点干,可仅做了解。 torchrun 和 torch.multiprocessing.spawn 都是在 PyTorch 中用于并行化和分布式训练的工具&a…...
