当前位置: 首页 > news >正文

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())
  • 有了元对象处理器:你只需专注业务逻辑,框架自动帮你填充这个时间

🛠️ 核心作用原理

  1. 拦截数据库操作
    MyBatis-Plus 在执行 insert()update() 操作时,会触发元对象处理器。
  2. 通过注解识别目标字段
    字段上的 @TableField(fill = FieldFill.INSERT) 注解会告诉处理器:"这个字段需要自动填充"。
  3. 反射动态赋值
    处理器利用反射机制,通过 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 {
    @Override
    public void insertFill(MetaObject metaObject) {
        this.strictInsertFill(metaObject, "createTime", Date.class, new Date());
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        this.strictInsertFill(metaObject, "updateTime", Date.class, new Date());
    }

}

🔍 关键概念拆解

概念

说明

MetaObject

对实体类的动态包装器,提供反射操作字段的能力(类似一个能透视对象内部结构的工具)

FieldFill

填充策略枚举,包含 INSERT(插入时填充)、UPDATE(更新时填充)等

strictInsertFill

严格模式填充方法,确保字段存在且类型匹配


⚠️ 常见问题排查

如果自动填充失效,检查:

  1. 处理器类是否添加了 @Component 注解
  2. 实体类字段名与处理器中写的名称是否完全一致(包括大小写)
  3. 是否在主启动类的扫描范围内(位于同一包或子包)
  4. 数据库字段是否有默认值冲突(建议同时设置数据库默认值 CURRENT_TIMESTAMP

🌟 设计意义

通过元对象处理器,实现了:
业务代码与非业务逻辑解耦(时间记录等通用操作集中管理)
消除重复代码(避免每个插入操作都写 setCreateTime)
保证数据一致性(比如强制所有表统一使用同一时间生成规则)


文章转载自:

http://iHm8Ko7I.mLycx.cn
http://ntmFsUcN.mLycx.cn
http://6CKT7fT1.mLycx.cn
http://xBgrA4WO.mLycx.cn
http://MIIn7S5I.mLycx.cn
http://rjfyjtbC.mLycx.cn
http://0wFPFXKe.mLycx.cn
http://jTuZJfXc.mLycx.cn
http://2qtxEjHT.mLycx.cn
http://SL9oIeNV.mLycx.cn
http://OuWLD0Z9.mLycx.cn
http://5EscWfZY.mLycx.cn
http://J87r09zb.mLycx.cn
http://mFDUbYXs.mLycx.cn
http://gu9yPTn5.mLycx.cn
http://zLy5Fiyv.mLycx.cn
http://CYLsFt7T.mLycx.cn
http://CU0QID87.mLycx.cn
http://Q1TofLSF.mLycx.cn
http://kt06Ssp9.mLycx.cn
http://d940s9H1.mLycx.cn
http://KqZN3rxh.mLycx.cn
http://JudesMzl.mLycx.cn
http://ucqzhJyv.mLycx.cn
http://Kwdzh9l8.mLycx.cn
http://5yh7uvtA.mLycx.cn
http://hUX3ik2u.mLycx.cn
http://eec7SezZ.mLycx.cn
http://80Xc18lV.mLycx.cn
http://tU0D82cD.mLycx.cn
http://www.dtcms.com/a/45818.html

相关文章:

  • logback日志输出配置范例
  • 基于第三方SDK的Windows平台全功能RTMP|RTSP直播播放器深度解析
  • C++20 中的 `consteval` 和 `constinit` 特性
  • Bash Shell 比较注入漏洞:分析与利用
  • 深入解析:域名转换成 IP 地址的多种方式
  • Element Plus使用(五)
  • Java 设计模式:软件开发的精髓与艺
  • 机器学习工程师技术图谱和学习路线
  • C++特殊类设计
  • 18、深拷贝与浅拷贝的区别【中高频】
  • 基于springboot+vue的线上考试系统的设计与实现
  • 使用Java构建高效的Web服务架构
  • 爬虫系列之发送请求与响应《一》
  • 【音视频】VLC播放器
  • 在 Windows 上为流体/结构工具设置 Ansys 远程求解管理器 (RSM):分步指南
  • 【计算机网络入门】初学计算机网络(七)
  • 算力100问☞第66问:如何降低大模型的训练成本?
  • 计算机网络:自顶向下方法——第四、五章 网络层
  • MySQL中的行级锁
  • 【git】【rebase】git修改提交信息的几种方法
  • 使用IDEA如何隐藏文件或文件夹
  • D033 neo4j知识图谱在线学习系统vue+django+neo4j【单课程】
  • 红锁如何解决分布式锁集群部署下的问题
  • 海康威视摄像头ISUP(原EHOME协议) 摄像头实时预览springboot 版本java实现,并可以在浏览器vue前端播放(附带源码)
  • 计算机视觉(opencv-python)之图像预处理基本操作(待补充)
  • 笔试练习day11
  • 【大模型】Windows桌面版AnythingLLM安装与配置教程
  • Docker网络模式实战
  • 大白话css第六章深入探索前沿技术、性能极致优化以及参与社区与知识沉淀
  • 6-1JVM的执行引擎处理