MyBatis-Plus @TableId注解之主键配置与常见问题分析
作者:bug攻城狮
MyBatis-Plus的@TableId注解用于标识实体类的主键字段,可配置主键列名、生成策略、是否保持全局格式等属性
在MyBatis-Plus中,@TableId注解用于标识实体类的主键字段,并可以配置多种属性。以下是@TableId可选的属性及其说明:
1.value
作用:指定数据库表中的主键列名(如果字段名与列名不一致时使用)。
示例:
@TableId(value = "user_id") private Long id;
- 表示实体类的
id字段对应数据库表的user_id列。
2.type
作用:指定主键生成策略(IdType枚举类型)。
可选值:
| 值 | 说明 |
|---|---|
| IdType.AUTO | 数据库自增(MySQL的AUTO_INCREMENT) |
| IdType.NONE | 无策略,需手动设置主键值 |
| IdType.INPUT | 用户手动输入主键值 |
| IdType.ASSIGN_ID | 默认策略,使用雪花算法生成Long类型ID |
| IdType.ASSIGN_UUID | 生成UUID字符串类型ID |
| IdType.ID_WORKER | 已废弃,改用ASSIGN_ID |
| IdType.UUID | 已废弃,改用ASSIGN_UUID |
示例:
@TableId(type = IdType.AUTO) private Long id; // 依赖数据库自增
3.keepGlobalFormat(3.5.0+)
作用:是否保持全局主键格式(如全局配置了前缀/后缀,是否应用到当前字段)。
默认值:false
示例:
@TableId(keepGlobalFormat = true) private String customId;
全局配置(替代@TableId)
如果不想在每个实体类上写@TableId,可以在application.yml中配置全局策略:
mybatis-plus: global-config: db-config: id-type: assign_id # 全局主键策略(默认为ASSIGN_ID) table-prefix: t_ # 表前缀(可选)
常见问题
数据库自增但未生效:
- 确保数据库表的主键列设置了
AUTO_INCREMENT。 - 确保
@TableId(type = IdType.AUTO)。
雪花算法ID冲突:
ASSIGN_ID生成的ID可能因系统时间回拨导致重复,需配置workerId和datacenterId。
UUID主键:
- 使用
@TableId(type = IdType.ASSIGN_UUID)时,字段类型应为String。
完整示例
@Data
@TableName("sys_user")
public class User {
@TableId(value = "user_id", type = IdType.ASSIGN_ID)
private Long id;// 雪花算法ID
@TableId(value = "uuid", type = IdType.ASSIGN_UUID)
private String uuid;// UUID字符串
}
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
