MyBatis-Plus 主键与字段映射:@TableId和@TableField用法详解

山间有风
山间有风
发布时间:2026-10-15| 3人浏览过
原创

在使用 MyBatis-Plus 进行开发时,经常遇到实体类字段命名与数据库表字段不完全匹配的情况。本文将深入解析常用的 @TableId 和 @TableField 注解,展示如何通过它们解决自动映射问题,并介绍主键生成策略(如自增与雪花算法)的配置方法。

1. 默认映射行为与冲突排查

在默认情况下,MyBatis-Plus 会假设实体类的字段名与数据库的列名完全一致,并在插入时自动处理主键。例如,若实体类和数据库中均使用标准的 id 字段,则无需额外注解即可正常插入:

但当我们将实体类中的主键字段重命名为 uid,而数据库表保持为 id 时,直接执行插入操作会抛出异常:

org.springframework.dao.DataIntegrityViolationException: com.atguigu.mybatisplus.mapper.UserMapper.insert (batch index #1) failed. Cause: java.sql.BatchUpdateException: Field 'uid' doesn't have a default value

这是因为框架无法确定哪个字段是主键,导致未能将值正确映射到数据库的 id 列。要解决这个问题,只需在实体类的主键字段上添加 @TableId 注解即可明确标识:

2. @TableId 的 value 属性应用

如果场景反过来:实体类的字段名为 id,但数据库中对应的列名为 uid。此时如果在字段上加了 @TableId,依然会报错:

@TableId
private Long id;

错误信息表现为:Unknown column 'id' in 'field list',因为框架会尝试向不存在的 id 列写入数据。此时应当利用 @TableId 的 value 属性来指定实际对应的数据库列名:

// 注意:仅设置一个 value 属性时,key 可以省略
// 作用:显式声明该主键对应数据库表中的 uid 字段
@TableId("uid") private Long id;

加上此配置后,即使实体类名为 id,也能成功插入到数据库的 uid 列中。

3. @TableId 的 type 属性与主键策略

除了字段映射,@TableId 还负责控制主键值的生成方式。在实际项目中,常用策略包括:

  • IdType.ASSIGN_ID:基于雪花算法(Snowflake)生成全局唯一 ID,无论数据库是否开启自增都适用。
  • IdType.AUTO:交由数据库管理自增,前提是数据表中该列必须设置为自增。

在前面的实验中,我们观察到未手动指定类型时,系统默认采用了雪花算法生成 ID:

若要切换回数据库自增模式,需将类型修改为 IdType.AUTO 并确保底层数据库表结构支持自增:

@TableId(value = "uid", type = IdType.AUTO)
private Long id;

另外,开发者也可以通过全局配置文件统一指定主键生成策略,以实现全局层面的规范化:

总结

@TableId 专用于标记主键及其生成逻辑,可通过 value 纠正字段映射偏差;@TableField 则专门针对非主键字段且与数据库列名不一致的场景。掌握这两个注解的细节,能有效规避因命名规范差异引发的 ORM 操作异常。

以上就是 MyBatis-Plus 常用注解 @TableId 和 @TableField 的详细用法,更多关于 Java 后端开发的知识资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。