SpringBoot 装饰器@TableField原理解析

 更新时间:2025年09月10日 14:54:56   作者:司南锤  
本文解析了MyBatis-Plus的@TableField注解,用于非主键字段与数据库列的映射及行为控制,涵盖自动填充、乐观锁、多租户等企业级功能,提供使用技巧、常见问题及示例代码,感兴趣的朋友跟随小编一起看看吧

1. 开胃菜:一句话认识 @TableField

@TableField 是 MyBatis-Plus 提供的字段级注解,用于非主键字段与数据库列的显式绑定行为控制
记住两个关键字:“非主键”“行为控制”——这是它与 @TableId 的核心差异。

2. 为什么需要它?

场景不用 @TableField 的问题用了 @TableField 的收益
实体字段名与列名不一致默认下划线转驼峰失效显式指定 value="user_name"
实体属性非数据库字段MP 会无脑拼接,SQL 报错exist=false 排除
敏感字段不允许查询查询会返回密码select=false 自动屏蔽
插入/更新时要填充手动 set 易遗漏fill=FieldFill.INSERT 自动填充
乐观锁版本号需要手动判断version=true 一键启用

3. 快速上手:5 个最常用的属性

@Data
@TableName("t_user")
public class User {
    @TableId(type = IdType.AUTO)
    private Long id;
    // 1. 列名不一致
    @TableField("user_name")
    private String name;
    // 2. 虚拟字段,不持久化
    @TableField(exist = false)
    private String token;
    // 3. 查询时不返回
    @TableField(select = false)
    private String password;
    // 4. 插入自动写入
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    // 5. 更新自动写入
    @TableField(fill = FieldFill.UPDATE)
    private LocalDateTime updateTime;
    // 6. 乐观锁
    @Version
    @TableField("version")
    private Integer version;
}

4. 源码级剖析:MP 如何把注解变成 SQL

4.1 解析入口

TableInfoHelper#initTableInfo → 反射读取所有字段 → 构建 TableFieldInfo 列表。

4.2 SQL 拼接

AbstractSqlInjector 注入通用 CRUD 方法 →
DefaultSqlProviderTableFieldInfo 生成 SQL 片段 →
select=false 的字段被主动剔除,exist=false 的字段直接忽略。

4.3 填充与乐观锁

MetaObjectHandler 接口处理 FieldFill
MybatisPlusInterceptor 内的 OptimisticLockerInnerInterceptor 处理 @Version

5. 企业级高阶玩法

5.1 动态过滤字段 —— 防止数据越权

// 场景:普通用户不能查看薪资字段
@TableField(select = false, condition = "%s != 'admin'")
private BigDecimal salary;

配合 TenantLineInterceptor 可实现动态列级权限

5.2 加密存储 —— 自定义 TypeHandler

@TableField(typeHandler = AesTypeHandler.class)
private String idCard;

插入自动加密,查询自动解密,业务代码零侵入

5.3 多租户隔离 —— 租户字段加索引

@TableField("tenant_id")
@InterceptorIgnore(tenantLine = "true") // 跳过插件,避免死循环
private Long tenantId;

6. 高频踩坑 & 排查清单

现象根因正确姿势
更新时 version 不生效实体里 version 为 null先查后改,或者手动 set
虚拟字段被持久化忘记写 exist=false加上即可
select=false 依然查出手写 SQL 未使用 MP 条件构造器LambdaQueryWrapperSqlSelectInterceptor
填充不生效没实现 MetaObjectHandler@Component 实现接口

7. 和 Spring 注解的“梦幻联动”

@Component
public class MyMetaHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        // Spring 容器直接注入
        this.strictInsertFill(metaObject, "createTime", 
                              LocalDateTime.class, LocalDateTime.now());
    }
}

@TableField 负责标记,Spring 负责注入,两者解耦,符合单一职责。

8. 总结:一张脑图记住 @TableField

@TableField
├─ value          映射列名
├─ exist          是否持久化
├─ select         是否参与查询
├─ fill           自动填充策略
├─ update         自定义 set 片段
├─ condition      动态条件
├─ typeHandler    类型转换
└─ keepGlobalFormat 保留全局格式

9. 一键复制即可跑的最小 Demo

GitHub:https://github.com/YOUR_NAME/mp-tablefield-demo
分支:feature/tablefield-demo
包含:加密、乐观锁、多租户、自动填充 4 大示例,Maven 一键启动。

10. 评论区 FAQ 预览(提前回答)

Q1@TableField@Column 有什么区别?
A:后者是 JPA 规范,只在 Hibernate 生效;前者是 MyBatis-Plus 专用,功能更强。

Q2:能否在 Kotlin data class 使用?
A:可以,但字段必须声明为 var,否则无法填充。

Q3:性能会下降吗?
A:解析结果缓存到 TableInfo,运行期零反射,性能损耗 < 1%。

到此这篇关于一文讲透一个 SpringBoot 装饰器 —— @TableField的文章就介绍到这了,更多相关SpringBoot 装饰器@TableField内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java操作FTP实现上传下载功能

    Java操作FTP实现上传下载功能

    这篇文章主要为大家详细介绍了Java如何通过操作FTP实现上传下载的功能,文中的示例代码讲解详细,对我们学习Java有一定帮助,需要的可以参考一下
    2022-11-11
  • Java获取文件路径的几种方式汇总

    Java获取文件路径的几种方式汇总

    本文介绍了使用Java处理文件路径的方法,包括使用java.io.File、java.nio.file.Paths类处理本地文件和类路径资源,以及在Web应用中获取路径的方法,它还提供了最佳实践和注意事项,如使用现代化的路径处理方式和跨平台兼容性,需要的朋友可以参考下
    2026-04-04
  • 冒泡排序的原理及java代码实现

    冒泡排序的原理及java代码实现

    冒泡排序法:关键字较小的记录好比气泡逐趟上浮,关键字较大的记录好比石块下沉,每趟有一块最大的石块沉底。算法本质:(最大值是关键点,肯定放到最后了,如此循环)每次都从第一位向后滚动比较,使最大值沉底,最小值上升一次,最后一位向前推进
    2016-02-02
  • Java中的远程方法调用之RPC使用

    Java中的远程方法调用之RPC使用

    本文介绍了RPC的基本概念、核心思想及其在分布式系统中的作用,重点讲解了Java中的三种RPC实现方式:RMI、Hessian和Dubbo,分别从适用场景、核心特点等方面做了对比对比较,并并提供了其基本实现代码示例,总结了各框架的优缺点,为实际开发中选择合适的技术栈提供了参考
    2026-05-05
  • 关于logBack配置日志文件及编码配置的问题

    关于logBack配置日志文件及编码配置的问题

    这篇文章主要介绍了logBack配置日志文件及编码配置的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • 如何将Mybatis连接到ClickHouse

    如何将Mybatis连接到ClickHouse

    这篇文章主要介绍了如何将Mybatis连接到ClickHouse,帮助大家更好得理解和学习使用Mybatis,感兴趣的朋友可以了解下
    2021-03-03
  • jpa使用注解生成表时无外键问题及解决

    jpa使用注解生成表时无外键问题及解决

    这篇文章主要介绍了jpa使用注解生成表时无外键问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • transactionAttributes各属性意义及配置

    transactionAttributes各属性意义及配置

    这篇文章主要介绍了transactionAttributes各属性意义及配置,具有一定参考价值,需要的朋友可以了解下。
    2017-09-09
  • IDEA设置Maven自动编译model的实现方法

    IDEA设置Maven自动编译model的实现方法

    本文主要介绍了IDEA设置Maven自动编译model的实现方法, maven结构的项目,我们在每次修改代码后都会需要手动编译,本文就可以解决这个问题,感兴趣的可以了解一下
    2023-08-08
  • Java数据结构中的HashMap和HashSet详解

    Java数据结构中的HashMap和HashSet详解

    HashMap和HashSet都是存储在哈希桶之中,通过本文我们可以先了解一些哈希桶是什么,本文结合实例代码给大家介绍的非常详细,需要的朋友参考下吧
    2023-10-10

最新评论