MyBatis-Plus 主键与字段映射:@TableId和@TableField用法详解
在使用 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 后端开发的知识资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













