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

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

在使用 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 相关产品和应用

全部下载

专题列表