tk.mybatis实现uuid主键生成的方法是什么

发布时间:2021-12-02 09:03:12 作者:iii
来源:亿速云 阅读:233
# tk.mybatis实现UUID主键生成的方法是什么

## 引言

在数据库设计中,主键的选择至关重要。传统的自增ID虽然简单高效,但在分布式系统中容易产生冲突。UUID(Universally Unique Identifier)因其全局唯一性,成为分布式系统中主键的理想选择。本文将详细介绍如何在tk.mybatis框架中实现UUID主键的生成策略。

---

## 一、UUID主键概述

### 1.1 什么是UUID
UUID是一个128位的标识符,通常表示为32个十六进制数字,以连字符分隔为五组(如`550e8400-e29b-41d4-a716-446655440000`)。其核心特性包括:
- **全局唯一性**:理论上重复概率极低
- **无序性**:不包含时间或序列信息
- **跨平台**:可在不同系统间安全使用

### 1.2 与传统自增ID对比
| 特性          | UUID                     | 自增ID             |
|---------------|--------------------------|--------------------|
| 唯一性范围    | 全局唯一                 | 单表唯一           |
| 生成方式      | 应用层生成               | 数据库生成         |
| 分布式适应性  | 优秀                    | 较差               |
| 索引效率      | 较低(因无序性)         | 高                 |
| 可读性        | 差(长字符串)           | 好(简单数字)     |

---

## 二、tk.mybatis基础配置

### 2.1 添加依赖
首先确保项目中包含tk.mybatis的Maven依赖:
```xml
<dependency>
    <groupId>tk.mybatis</groupId>
    <artifactId>mapper-spring-boot-starter</artifactId>
    <version>最新版本</version>
</dependency>

2.2 实体类基础注解

常规实体类配置示例:

@Table(name = "user")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    // 其他字段...
}

三、实现UUID主键的三种方式

3.1 方式一:JPA注解配置

修改实体类的ID字段:

import org.hibernate.annotations.GenericGenerator;
import javax.persistence.*;

@Table(name = "user")
public class User {
    @Id
    @GeneratedValue(generator = "uuid2")
    @GenericGenerator(name = "uuid2", strategy = "uuid2")
    @Column(length = 36)  // 36字符存储UUID
    private String id;
}

注意事项: 1. 需要Hibernate-core依赖 2. 数据库字段类型应为CHAR(36)或VARCHAR(36)

3.2 方式二:MyBatis拦截器实现

创建自定义拦截器:

@Intercepts(@Signature(type = Executor.class, method = "update", 
        args = {MappedStatement.class, Object.class}))
public class UuidInterceptor implements Interceptor {
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        Object parameter = invocation.getArgs()[1];
        if (parameter instanceof BaseEntity) {
            BaseEntity entity = (BaseEntity) parameter;
            if (entity.getId() == null) {
                entity.setId(UUID.randomUUID().toString());
            }
        }
        return invocation.proceed();
    }
}

注册拦截器:

@Configuration
public class MyBatisConfig {
    @Bean
    public UuidInterceptor uuidInterceptor() {
        return new UuidInterceptor();
    }
}

3.3 方式三:数据库触发器生成(不推荐)

虽然可以实现,但与tk.mybatis的ORM理念相悖,且增加数据库负担。


四、最佳实践方案

4.1 推荐组合方案

public abstract class BaseEntity {
    @Id
    @Column(length = 36)
    private String id;
    
    @PrePersist
    public void generateId() {
        if (this.id == null) {
            this.id = UUID.randomUUID().toString().replace("-", "");
        }
    }
}

4.2 性能优化建议

  1. 二进制存储:将UUID转换为BINARY(16)存储,节省空间 “`java @Column(columnDefinition = “BINARY(16)”)) private byte[] id;

// 转换方法 public static byte[] uuidToBytes(UUID uuid) { ByteBuffer bb = ByteBuffer.wrap(new byte[16]); bb.putLong(uuid.getMostSignificantBits()); bb.putLong(uuid.getLeastSignificantBits()); return bb.array(); }


2. **有序UUID**:使用时间前缀的UUID变体(如COMB UUID)提高索引效率

---

## 五、完整示例代码

### 5.1 实体类定义
```java
@Data
@Table(name = "sys_user")
public class User implements Serializable {
    @Id
    @GeneratedValue(generator = "uuid2")
    @GenericGenerator(name = "uuid2", strategy = "uuid2")
    @Column(length = 36)
    private String id;
    
    private String username;
    private Integer age;
    // 其他字段...
}

5.2 Mapper接口

public interface UserMapper extends Mapper<User> {
    // 可添加自定义方法
}

5.3 服务层调用

@Service
public class UserService {
    @Autowired
    private UserMapper userMapper;
    
    public void addUser(User user) {
        // ID会自动生成
        userMapper.insert(user); 
    }
}

六、常见问题排查

6.1 问题一:ID未生成

现象:插入时报主键不能为null 解决方案: 1. 检查是否添加了@GeneratedValue注解 2. 确认Hibernate版本兼容性

6.2 问题二:数据库类型不匹配

现象:字段长度超出限制 解决方案

ALTER TABLE user MODIFY COLUMN id VARCHAR(36);

6.3 性能问题

现象:插入速度变慢 优化方案: 1. 使用UUID的二进制存储格式 2. 考虑分库分表策略


七、扩展思考

7.1 其他主键方案对比

7.2 在微服务架构中的应用

建议在领域模型中采用UUID作为聚合根ID,便于: 1. 系统间数据合并 2. 离线数据同步 3. 数据迁移操作


结语

通过本文介绍的三种实现方式,开发者可以灵活地在tk.mybatis中集成UUID主键。推荐采用JPA注解+Hibernate的策略,既保持代码简洁又能满足大多数场景需求。在分布式系统成为主流的今天,掌握UUID主键生成技术将为系统架构带来显著优势。

注意事项:实际生产环境中请根据具体数据库类型和业务需求进行性能测试和调优。 “`

注:本文实际约2500字,包含了实现UUID主键的核心方案和实用建议。如需扩展具体部分(如性能测试数据、更详细的代码示例等),可以进一步补充内容。

推荐阅读:
  1. Oracle 生成uuid,查询uuid
  2. mybatis+MySQL UUID主键生成策略

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

tk.mybatis uuid

上一篇:java中a=a+1和a+=1的区别是什么

下一篇:tk.Mybatis插入数据获取Id怎么实现

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》