最常用方式是在实体类主键字段上加@tableid注解并指定type属性;value仅用于列名不一致时映射,不参与id生成;不加注解则按idtype.none处理,插入必报错。

直接在实体类主键字段上加 @TableId 注解,并通过 type 属性指定生成策略,是最常用也最明确的方式。value 属性仅在数据库列名与字段名不一致时才需显式填写。
主键字段必须标注 @TableId
MyBatis-Plus 不会自动识别主键字段名(比如 id 或 user_id),哪怕字段名是 id 也必须加注解,否则默认按 IdType.NONE 处理——即不生成 ID,插入时若没手动赋值会报错。
- 不加
@TableId→ 主键无策略,insert 语句不含 id 字段,数据库又没设默认值或自增,就会失败 - 加了但没写
type→ 实际采用默认策略IdType.ASSIGN_ID(雪花算法) - 字段名是
userId,数据库列是user_id→ 必须写@TableId(value = "user_id")
常用 type 策略及对应要求
主键生成逻辑由 type 决定,不同策略对数据库和字段类型有硬性要求:
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
-
IdType.AUTO:数据库必须开启自增(如 MySQL 的 AUTO_INCREMENT),且 insert SQL 中不传 id 值;实体字段类型建议为
Long或Integer -
IdType.INPUT:插入前必须手动调用
setId(...),否则报错;适合订单号、编码类业务主键 -
IdType.ASSIGN_ID:默认策略,用雪花算法生成
Long型 ID;数据库字段需为BIGINT,不能是INT -
IdType.ASSIGN_UUID:生成 32 位小写 UUID 字符串;字段类型必须是
String,数据库列建议定义为VARCHAR(36)
value 属性只解决列名映射问题
它不参与 ID 生成逻辑,纯粹是字段与数据库列之间的名称桥接:
- 实体字段叫
uid,数据库列叫id→@TableId(value = "id") - 实体字段叫
id,数据库列也叫id→value可省略 - 别名写错(如
@TableId(value = "user_idd"))→ 插入时报 “Unknown column 'user_idd'”
策略优先级和全局配置
局部注解 > 全局配置 > 默认策略,三者可叠加使用:
- 想让所有实体都用雪花 ID,可在
application.yml配置:
mybatis-plus:
global-config:
db-config:
id-type: assign_id - 某个特殊表仍要数据库自增 → 在该实体字段上写
@TableId(type = IdType.AUTO),会覆盖全局设置 - 全局配了
table-prefix: t_,但某个表不用前缀 → 单独用@TableName(value = "user", autoResultMap = true)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










