mybatis-plus实体类主键生成策略

一、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.ymlapplication.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。
相关推荐
这个DBA有点耶6 小时前
同城双活落地的三座山:网络延迟、脑裂预防、反向同步
数据库·架构·dba
青春之我_XP6 小时前
MySQL 常用日期函数 实战指南
数据库·sql·mysql·数据分析·数据库开发·日期函数
Nturmoils6 小时前
sys_dump 备了库,角色和权限别漏在外面
数据库
接着奏乐接着舞。7 小时前
【2026】73道Redis 常见面试题与参考答案
数据库·redis·后端·缓存
程序员黎剑8 小时前
Spring-Bean生命周期-构造器访问Autowired字段为null
java·后端·spring
古法安卓8 小时前
Android-重启流程源码解析
android·java·android studio
其实防守也摸鱼8 小时前
权限提升与横向移动:从内网渗透到域控的完整技术图谱
运维·服务器·数据库·安全·github·copilot·渗透
清水白石0088 小时前
Python 类型设计深度解析:TypedDict 能否替代 dataclass?从 JSON 数据边界到 API 设计的最佳实践
java·python·json
人生百态,人生如梦8 小时前
每日论文解读(9.1)——ReToolSQL:面向鲁棒Text-to-SQL的Agentic强化学习与工具增强两阶段训练框架
数据库·sql
DevOpenClub8 小时前
网页采集如何稳定输出结构化数据:JSON、链接与快照三阶段流水线
数据库·json·api