主键生成策略-MyBatis-plus

常用的主键生成策略

主键生成策略是指在数据库中为每条记录生成唯一标识符的方法。常用的主键生成策略有以下几种:

  1. 自增长(自动编号):每添加一条记录,自动加 1;优点是能够保证主键唯一,缺点是无法在分布式系统中实现。

  2. UUID/GUID:采用随机算法生成的字符串,理论上能够保证不重复,但主键长度较长,不便于存储和索引。

  3. 分布式ID生成器:采用雪花算法、UID、美团Leaf等算法生成的主键,能够在分布式系统中实现全局唯一,且主键长度较短,但实现略复杂。

  4. 数据库序列(Sequence):一种由数据库提供的生成主键的方法,能够保证主键唯一,但无法在分布式系统中实现。

  5. 组合主键:将多个字段组合成一个主键,能够保证唯一性,但可能存在冗余数据和空值。

Java中的主键生成策略

在Java中,给实体类定义主键时一般需要指定主键生成策略,常用的主键生成策略有以下几种:

  1. 自增长策略(GenerationType.IDENTITY) 这种策略是指数据库自动为每一行添加一个唯一的标识列,并且在插入数据时自动递增。在MySQL中,可以使用AUTO_INCREMENT关键字来定义自增长列。

  2. 序列策略(GenerationType.SEQUENCE) 序列策略是指使用数据库中的序列生成主键,序列是一种特殊的对象,可以自动创建一组连续的数字。在Oracle中,可以使用CREATE SEQUENCE语句来定义序列。

  3. 表策略(GenerationType.TABLE) 表策略是指在数据库中定义一个专门用于生成主键的表,包含了一个主键字段和一个取值字段。在插入数据时,先从这个表中获取一个值作为主键,并且同时更新取值字段的值,确保每个主键都是唯一的。

  4. UUID策略(GenerationType.UUID) UUID策略是指使用Java中的UUID来生成主键,UUID是一种通用唯一标识符,可以作为主键使用。

在JPA中,可以通过@Entity注解为实体类定义主键生成策略,例如:

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) // 指定自增长策略
    private Long id;
    ...
}

雪花算法(Snowflake ID Algorithm)

雪花算法是一种用于生成全局唯一ID的算法,它的全名为雪花ID算法(Snowflake ID Algorithm)。该算法产生的ID是一个64位的整型数,由三部分组成:时间戳 + 机器ID + 序列号。其中,时间戳占41位,可以精确到毫秒级别;机器ID占10位,可以支持1024台机器;序列号占12位,可以支持每台机器每毫秒产生4096个ID。因此,雪花算法可以在分布式系统中生成唯一的ID,保证ID的唯一性和有序性,同时也支持高并发的ID生成需求。

在实际应用中,可以根据业务需求进行灵活的配置,例如调整时间戳的起始时间、机器ID的分配方式等等,以满足不同的业务场景。

@Data
public class User {


//    @TableId(type = IdType.AUTO)自动增长

    /* MyBatils_Plus自带策略
      @TableId(type = IdType.ID_WORKER)//会生成一个19位的值,数字类型使用这种类型,比如long
      @TableId(type = IdType.ID_WORKER_STR)//会生成一个19位的值,字符串类型使用这种类型,比如String
      */
//   @TableId(type = IdType.INPUT)自己设置ID
//   @TableId(type = IdType.NONE)//不用任何策略,自己设置
//   @TableId(type = IdType.UUID)//每次生成随机唯一的值
    private Long id;
    private String name;
    private Integer age;
    private String email;
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值