MyBatis-Plus 主键生成策略用于自动生成数据库表唯一主键,大幅简化主键赋值操作。
核心注解:@TableId(标记实体主键字段)
核心枚举:IdType(定义主键生成规则)
支持场景:数据库自增、雪花算法、UUID、数据库序列(Oracle/PostgreSQL)、自定义生成
版本特性:3.3.0 + 版本支持自动识别主键类型,无需手动指定
@TableId标记实体类的主键字段,指定主键名和生成策略:
@TableId(value = "id", type = IdType.ASSIGN_ID)
private Long id;value:数据库主键列名
type:主键生成策略(IdType 枚举)
IdTypeMyBatis-Plus 内置 6 种主键策略,覆盖所有业务场景:
3.3.0 + 默认策略,全局唯一,分布式场景通用,无需数据库配置:
@Data
public class User {
// 雪花算法:自动生成 Long 类型主键
@TableId(type = IdType.ASSIGN_ID)
private Long id;
private String name;
}依赖数据库主键自增设置,适用于单库单表:
@Data
public class User {
@TableId(type = IdType.AUTO)
private Long id;
}注意:数据库表必须设置
AUTO_INCREMENT
String 类型主键,无规则唯一值:
@Data
public class User {
@TableId(type = IdType.ASSIGN_UUID)
private String id;
}主键值由业务代码手动赋值:
@Data
public class User {
@TableId(type = IdType.INPUT)
private Long id;
}适用于 Oracle、DB2、PostgreSQL 等 依赖序列 的数据库,需配合 @KeySequence 使用。
MyBatis-Plus 内置主流数据库序列生成器:
DB2KeyGenerator
H2KeyGenerator
KingbaseKeyGenerator
OracleKeyGenerator
PostgreKeyGenerator
@KeySequence 注解绑定数据库序列,指定主键类型:
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.IdType;
// 绑定 Oracle 序列,主键类型为 String
@KeySequence(value = "SEQ_ORACLE_STRING_KEY", clazz = String.class)
@Data
public class YourEntity {
// 序列生成必须使用 INPUT 类型
@TableId(value = "ID_STR", type = IdType.INPUT)
private String idStr;
}支持全局统一设置,无需每个实体单独配置 @TableId(type)
mybatis-plus:
global-config:
db-config:
# 全局默认主键策略:雪花算法
id-type: assign_id
# 序列生成器(仅 Oracle/PostgreSQL 等需要)
key-generator: com.baomidou.mybatisplus.extension.incrementer.OracleKeyGeneratorimport com.baomidou.mybatisplus.autoconfigure.MybatisPlusPropertiesCustomizer;
import com.baomidou.mybatisplus.extension.incrementer.H2KeyGenerator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyBatisPlusConfig {
/**
* 自定义全局配置
*/
@Bean
public MybatisPlusPropertiesCustomizer plusPropertiesCustomizer() {
return plusProperties ->
plusProperties.getGlobalConfig().getDbConfig()
// 设置序列生成器
.setKeyGenerator(new H2KeyGenerator())
// 设置全局主键策略
.setIdType(IdType.ASSIGN_ID);
}
/**
* 单独注册序列生成器 Bean
*/
@Bean
public H2KeyGenerator keyGenerator() {
return new H2KeyGenerator();
}
}内置策略不满足需求时,实现 IKeyGenerator 接口扩展自定义生成规则:
import com.baomidou.mybatisplus.extension.incrementer.IKeyGenerator;
import org.springframework.stereotype.Component;
@Component
public class CustomIdGenerator implements IKeyGenerator {
@Override
public String executeSql(String incrementerName) {
// 自定义主键生成 SQL/逻辑
return "SELECT your_id_sequence.nextval FROM DUAL";
}
}实体 @TableId(type) > 全局配置
全局配置 > 默认策略(ASSIGN_ID 雪花算法)
3.3.0 + 版本:自动识别数据库主键类型,无需手动配置
主键类型不匹配 雪花算法生成 Long 类型,数据库字段必须为 bigint
Oracle 序列报错 必须使用 IdType.INPUT + @KeySequence 组合
自增 ID 失效 数据库未开启 AUTO_INCREMENT,且策略配置为 AUTO
废弃 API 使用 禁止使用 ID_WORKER,统一使用 ASSIGN_ID
分布式场景 禁止使用数据库自增,推荐雪花算法 ASSIGN_ID
核心选择:分布式项目用 ASSIGN_ID(雪花算法),单库项目用 AUTO(自增)
配置灵活:支持注解单独配置、全局统一配置
兼容全面:适配 MySQL、Oracle、PostgreSQL 等所有主流数据库
扩展便捷:可通过 IKeyGenerator 实现自定义主键生成