简介

我们可以通过 @TableId 注解的 type 属性来设置主键 id 的增长策略,一共有如下几种主键策略,可根据情况自由配置。

AUTO(数据库 ID 自增)

对于像 MySQL 这样的支持主键自动递增的数据库,我们可以使用 IdType.AUTO 策略。

@TableName("tb_user")
public class User {@TableId(type = IdType.AUTO)private Long id;private String name;private Integer age;private String email;
}

NONE(无状态)

如果使用 IdType.NONE 策略,表示未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT)
INPUT(insert 前自行 set 主键值)

针对有序列的数据库:比如 Oracle,SQLServer 等,当需要建立一个自增字段时,需要用到 sequence。

  • 在 Oracle 11g 中,设置自增字段,需要先创建序列(SQUENCE),再创建一个触发器(TRIGGER)。
  • 在 Oracle 12c 中,只需要使用 IDENTITY 属性就可以了,和 MySQL 一样简单。

Mybatis-Plus 已经定义好了常见的数据库主键序列,我们首先只需要在 @Configuration 类中定义好 @Bean。Mybatis-Plus 内置了如下数据库主键序列(如果内置支持不满足你的需求,可实现 IKeyGenerator 接口来进行扩展):

  • DB2KeyGenerator
  • H2KeyGenerator
  • KingbaseKeyGenerator
  • OracleKeyGenerator
  • PostgreKeyGenerator
    示例:
@Bean
public OracleKeyGenerator oracleKeyGenerator(){return new OracleKeyGenerator();
}

然后实体类配置主键Sequence,指定主键策略为 IdType.INPUT 即可:
提示:支持父类定义 @KeySequence 子类使用,这样就可以几个表共用一个 Sequence

示例

@TableName("TEST_SEQUSER")
@KeySequence("SEQ_TEST")//类注解
public class TestSequser{@TableId(value = "ID", type = IdType.INPUT)private Long id;
}

如果主键是 String 类型的,也可以使用:
如何使用 Sequence 作为主键,但是实体主键类型是 String 也就是说,表的主键是 varchar2,但是需要从 sequence 中取值

  • 实体定义 @KeySequence 注解 clazz 指定类型 String.class
  • 实体定义主键的类型 String
    注意:oracle 的 sequence 返回的是 Long 类型,如果主键类型是 Integer,可能会引起 ClassCastException。
    示例:
@KeySequence(value = "SEQ_ORACLE_STRING_KEY", clazz = String.class)
public class User{@TableId(value = "ID_STR", type = IdType.INPUT)private String idStr;...
}

ASSIGN_ID( ★★★★★)

如果不设置 type 值,默认则使用 IdType.ASSIGN_ID 策略(自 3.3.0 起)。该策略会使用雪花算法自动生成主键 ID,主键类型为 Long 或 String(分别对应 MySQL 的表字段为 BIGINT 和 VARCHAR)
提示:该策略使用接口 IdentifierGenerator 的方法 nextId(默认实现类为 DefaultIdentifierGenerator 雪花算法)。

雪花算法(SnowFlake)是 Twitter 开源的分布式 id 生成算法。其核心思想就是:使用一个 64 bit 的 long 型的数字作为全局唯一 id。在分布式系统中的应用十分广泛,且 ID 引入了时间戳,基本上保持自增的。

最高位不用,41bit保存时间戳,单位是毫秒,10bit的机器位,12bit的唯一序列号,可以理解是某一毫秒内,某台机器生成了不重复的序列号
10bit 一般一会分为5bit的datacenterId存储位和5bit的workerId存储位

示例

@Data
public class User {//指定主键生成策略使用雪花算法(默认策略)@TableId(type = IdType.ASSIGN_ID)private Long id;private String userName;private String passWord;
}

注意:

  • 类字段类型需要为Long
  • 数据库表字段类型为bigint

ASSIGN_UUID(不含中划线的UUID)

如果使用 IdType.ASSIGN_UUID 策略,则会自动生成不含中划线的 UUID 作为主键。主键类型为 String,对应 MySQL 的表字段为 VARCHAR(32)
提示:该策略使用接口 IdentifierGenerator 的方法 nextUUID

示例

@Data
public class User {//指定主键生成策略为不含中划线的UUID@TableId(type = IdType.ASSIGN_UUID)private String id;private String userName;private String passWord;
}

全局策略配置

假设我们希望默认全部都使用 AUTO 策略(数据库 ID 自增),那么可以在 application.properties 中添加如下配置进行修改:

mybatis-plus.global-config.db-config.id-type=auto

MyBatisPlus主键生成策略相关推荐

  1. Mybatis-Plus主键生成策略详解

    文章目录 前言 一.官网 二.主键注解@TableId说明 1.源码 2.作用 3.使用 三.主键生成策略-IdType枚举说明 1.源码 2.说明 3.全局设置 三.ID生成器介绍 1.Identi ...

  2. [MyBatisPlus]常用注解_@TableName_@TableId_@TableField_@TableLogic通过全局配置配置主键生成策略

    常用注解 @TableName 设置实体类所对应的表名 如果全部表都有某个前缀,难道我们要通过一个一个加注解的方式来解决实体类对应表名问题吗? 我们可以通过配置文件来解决这个问题: @TableId ...

  3. hibernate 7大主键生成策略详解与对象状态

    一:代理主键_主键自增 1.identity 1.采用底层数据库本身提供的主键生成标识符,条件是数据库支持自动增长数据类型 2.该生成器要求在数据库中把主键定义成为自增长类型.适用于代理主键 2.in ...

  4. Hibernate各种主键生成策略与配置详解 - 真的很详细啊!!

    1.assigned 主键由外部程序负责生成,在 save() 之前必须指定一个.Hibernate不负责维护主键生成.与Hibernate和底层数据库都无关,可以跨数据库.在存储对象前,必须要使用主 ...

  5. hibernate之主键生成策略

    一.主键类型 1.自然主键(主键本身就是表中的一个字段,实体中一个具体的属性) 表中已经具有某字段,并且该字段具有业务含义作为主键,称之为自然主键. 例如:在person表中的身份证号,既是唯一的,又 ...

  6. 基于按annotation的hibernate主键生成策略

    这里讨论代理主键,业务主键(比如说复合键等)这里不讨论. 一.JPA通用策略生成器 通过annotation来映射hibernate实体的,基于annotation的hibernate主键标识为@Id ...

  7. Hibernate标识符属性(主键)生成策略全析

    数据库中的主键能够唯一识别一条记录,它可以是一个字段也可以是多个字段的组合.主键的主要作用是标识表中的一条记录,还有和其他表中的数据进行关联.数据库中的主键类型必须符合唯一性约束和非空约束.作为附加属 ...

  8. 主键由数据库mysql 映射native_Hibernate主键生成策略详解

    转载自:http://blog.csdn.net/wanghuan203/article/details/7562395 hibernate提供的主键生成策略,使我们可以在实体类的映射xml文件中设定 ...

  9. hibernate框架学习第二天:核心API、工具类、事务、查询、方言、主键生成策略等...

    核心API Configuration 描述的是一个封装所有配置信息的对象 1.加载hibernate.properties(非主流,早期) Configuration conf = new Conf ...

最新文章

  1. Cocos 实用渲染实战(一):高性价比的人物皮肤渲染
  2. 在winform中使用wpf窗体
  3. 海外服务器搭建网站访问很慢,海外服务器访问速度变慢了怎么办
  4. python 合并excel 自动更新_手把手教你4种方法用Python批量实现多Excel多Sheet合并
  5. mysql 索引过长1071-max key length is 767 byte
  6. 【Hive】表生成(Table-Generating)函数
  7. Python九九乘法表(作业)
  8. Microsoft Visio 2010密钥
  9. usb转rs485 linux驱动下载,USB转RS485串口驱动
  10. [从零开始A31S]之安装虚拟机以及下载ubuntu
  11. bat脚本打开cmd执行命令
  12. 永恒之蓝 ms17_010漏洞
  13. SystemService简介
  14. 免费Zblog站群采集管理插件工具
  15. 7 月 24 号张小龙内部讲座《通过微信谈产品》
  16. 《再探设计模式》装饰者:为什么比继承更灵活?
  17. 嘉洋原创一:价值规律主导下的行情周期
  18. spring配置读取properties文件
  19. “expression cannot be used as a function”报错
  20. 如何注册Docker账号

热门文章

  1. 虚拟机的网络连接类型 - 网桥Bridged, NAT, Host-only
  2. 编程语言中的 DUCK TYPING|python、c++、java、go
  3. 【Elasticsearch】Elasticsearch命令行操作
  4. 实习日记——Day29
  5. jq循环定时器动态切换网站标题
  6. Java基础知识 变量 基本类型 类型转换 标识符 关键字 运算符 循环 分支结构 JVM
  7. 一、关于STM32 SPI NSS的讨论
  8. 松下伺服参数设置如何保存
  9. CPSE安博会 | 江波龙邀您共探智慧安防,赋能存储未来
  10. certutil(certutilexe应用程序错误)