一、MyBatis-Plus 主键生成策略
MyBatis-Plus 提供了多种主键生成策略,可以通过注解 @TableId
在实体类中指定主键生成方式。以下是常见的几种策略及其用法:
1. 自动递增(AUTO)
适用于数据库主键自增(如 MySQL 的 AUTO_INCREMENT
)。数据库自动生成主键值,无需手动设置。
java
@TableId(type = IdType.AUTO)
private Long id;
2. 雪花算法(ASSIGN_ID)
默认策略 ,使用雪花算法生成分布式唯一 ID(Long 类型),@TableId 不配置 type 默认使用雪花算法生成键
。适合分布式系统。
java
@TableId(type = IdType.ASSIGN_ID)
private Long id;
3. 用户输入(INPUT)
由用户手动设置主键值。如果不赋值,数据库可能会报错(若主键为非空字段)。
java
@TableId(type = IdType.INPUT)
private Long id;
4. UUID(ASSIGN_UUID)
生成 32 位 UUID 字符串(String 类型)。需确保数据库字段类型为字符串(如 VARCHAR)。
java
@TableId(type = IdType.ASSIGN_UUID)
private String id;
5. 无主键(NONE)
表示无主键,需确保表无主键列或通过其他方式处理。
java
@TableId(type = IdType.NONE)
private Long id;
6. 自定义主键生成器
通过实现 IdentifierGenerator
接口自定义主键生成逻辑,并在注解中指定生成器类。
java
public class CustomIdGenerator implements IdentifierGenerator {
@Override
public Number nextId(Object entity) {
// 自定义生成逻辑
return 自定义ID值;
}
}
java
@TableId(type = IdType.ASSIGN_ID, generator = "CustomIdGenerator")
private Long id;
二、默认主键策略
默认策略:IdType.ASSIGN_ID(雪花算法)。
若不配置任何策略(实体类无 @TableId 注解且未全局配置),MyBatis-Plus 自动使用雪花算法生成 Long 类型 ID。
全局默认值:
GlobalConfig.DbConfig 中 id-type 的默认值为 ASSIGN_ID
可在 application.yml
或 application.properties
中设置全局默认策略:
yaml
mybatis-plus:
global-config:
db-config:
id-type: assign_id # 默认为雪花算法
三、配置方式与优先级
配置生效优先级:局部注解 > 全局配置 > 默认策略。
局部注解配置(实体类字段上):
java
@TableId(type = IdType.AUTO) // 示例:数据库自增
private Long id;
全局配置(application.yml):
yaml
mybatis-plus:
global-config:
db-config:
id-type: auto # 可选值:auto(自增)、assign_id(雪花)、assign_uuid(UUID)等
四、注意事项
- 全局配置对所有实体类生效,但被 @TableId 注解的字段会覆盖全局设置
- 数据库表的主键字段需与实体类字段类型匹配(如
ASSIGN_ID
对应 Long,ASSIGN_UUID
对应 String)。 - 若使用
AUTO
,需确保数据库支持自增主键。 - 自定义生成器需注册为 Spring Bean。