竹简文档
UUID 生成

UuidV7Generator

UUID v7 生成器,实现 MyBatis-Plus IdentifierGenerator 接口

UuidV7Generator

UuidV7Generator 是筱工具(Java) 的 UUID v7 生成器,位于 com.xlf.utility.incrementer 包下。
它实现了 MyBatis-Plus 的 IdentifierGenerator 接口:

  • nextUUID(...):生成 UUID v7 字符串(推荐用于字符串主键)
  • nextId(...):返回 6 位随机整数(用于数值主键场景的兜底)

类定义

UuidV7Generator.java
package com.xlf.utility.incrementer;

import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator;
import com.github.f4b6a3.uuid.UuidCreator;

public class UuidV7Generator implements IdentifierGenerator {

    @Override
    public Number nextId(Object entity) {
        return Integer.parseInt(RandomUtil.createRandomInt(6));
    }

    @Override
    public String nextUUID(Object entity) {
        return UuidCreator.getTimeOrderedEpoch().toString();
    }
}

方法行为说明

方法返回值说明
nextUUID(Object entity)String基于 UuidCreator.getTimeOrderedEpoch() 生成 UUID v7
nextId(Object entity)Number返回 6 位随机整数(RandomUtil.createRandomInt(6)

UUID v7 特性

UUID v7 是一种时间有序的 UUID 格式,相较于传统的 UUID v4 具有以下优势:

特性UUID v4UUID v7
排序性完全随机,无序按时间顺序递增
数据库友好索引效率低索引效率高(近似有序)
碰撞概率理论存在极低(时间戳 + 随机位)
可追溯无法获取生成时间可提取生成时间戳

UUID v7 结构

┌──────────────┬────────────┬──────────────┬──────────────────┐
│   时间戳      │  版本位     │   序列位      │    随机位         │
│  (48 bits)   │  (4 bits)  │  (12 bits)   │    (62 bits)     │
│  毫秒级时间戳  │   固定为 7  │  同毫秒内自增  │    随机数         │
└──────────────┴────────────┴──────────────┴──────────────────┘

在 MyBatis-Plus 中使用

配置生成器

MybatisPlusConfig.java
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.xlf.utility.incrementer.UuidV7Generator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MybatisPlusConfig {

    @Bean
    public UuidV7Generator uuidV7Generator() {
        return new UuidV7Generator();
    }
}

实体类配置

UserDO.java
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

@Data
@TableName("t_user")
public class UserDO {

    // 使用 ASSIGN_UUID 策略,MyBatis-Plus 会调用 UuidV7Generator.nextUUID()
    @TableId(type = IdType.ASSIGN_UUID)
    private String id;

    private String username;
    private String email;
    private LocalDateTime createdAt;
}

插入时自动生成

UserService.java
import org.springframework.stereotype.Service;

@Service
public class UserService {

    public void createUser(UserDTO dto) {
        UserDO user = new UserDO();
        user.setUsername(dto.getUsername());
        user.setEmail(dto.getEmail());
        user.setCreatedAt(LocalDateTime.now());
        // id 字段无需手动设置

        // 插入时 MyBatis-Plus 自动调用 UuidV7Generator 生成 UUID v7
        userMapper.insert(user);

        // 此时 user.getId() 已被赋值
        System.out.println("生成的 ID: " + user.getId());
    }
}

依赖说明

UuidV7Generator 依赖 uuid-creator 库:

pom.xml
<dependency>
    <groupId>com.github.f4b6a3</groupId>
    <artifactId>uuid-creator</artifactId>
    <version>6.1.1</version>
</dependency>

生成的 UUID 示例

Example.java
import com.xlf.utility.incrementer.UuidV7Generator;

UuidV7Generator generator = new UuidV7Generator();

// 连续生成多个 UUID v7(时间有序)
String id1 = generator.nextUUID(null);  // 018f3b7a-1c2d-7d3e-8f4a-5b6c7d8e9f0a
String id2 = generator.nextUUID(null);  // 018f3b7a-1c2d-7d3e-8f4a-5b6c7d8e9f0b
String id3 = generator.nextUUID(null);  // 018f3b7a-1c2d-7d3e-8f4a-5b6c7d8e9f0c

// UUID v7 通常按时间趋势有序,适合索引插入场景

与雪花算法的对比

特性UUID v7雪花算法
长度36 字符字符串19 位数字
存储空间36 字节(字符串)或 16 字节(二进制)8 字节
排序性时间有序时间有序
数据中心/机器 ID支持
基因位支持
适用场景需要字符串 ID、跨系统兼容高性能、短 ID、分库分表

选择建议

  • 使用 UUID v7:需要字符串格式 ID、跨系统集成、对 ID 长度不敏感
  • 使用雪花算法:高性能要求、需要短数字 ID、分库分表场景

下一步

On this page