返回

解决 MybatisPlus 使用 saveBatch 方法批量插入时雪花算法 ID 重复问题

后端

使用 MybatisPlus 解决批量插入中的 ID 重复问题

简介

MybatisPlus 是一个流行的持久层框架,它提供了增强 Mybatis 功能的便捷和强大的特性。saveBatch 方法是 MybatisPlus 提供的批量插入方法,它允许用户一次性插入多条记录。但是,在使用 saveBatch 方法时,可能会遇到 ID 重复的问题。本文将介绍如何使用 @TableId 注解解决这一问题。

ID 重复问题

MybatisPlus 默认使用数据库自增主键的方式生成 ID。当使用 saveBatch 方法批量插入时,数据库会为每条记录生成一个自增主键。如果插入的记录数量超过了数据库自增主键的最大值,就会出现 ID 重复的问题。

解决方案:使用 @TableId 注解

为了解决 ID 重复的问题,可以使用 MybatisPlus 提供的 @TableId 注解。@TableId 注解可以指定主键的生成策略。在使用 saveBatch 方法批量插入时,可以将 @TableId 注解的 type 属性设置为 IdType.ASSIGN_ID 。这样,MybatisPlus 就会使用雪花算法来生成 ID。

雪花算法

雪花算法是一种分布式唯一 ID 生成算法。它可以保证在高并发场景下生成唯一且有序的 ID。雪花算法的 ID 结构如下:

  • 时间戳 (41 bit) :代表 ID 生成的时间戳,单位为毫秒。
  • 机器 ID (10 bit) :代表生成 ID 的机器 ID。
  • 序列号 (12 bit) :代表在同一毫秒内生成的 ID 序列号。

示例代码

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.extension.activerecord.Model;

public class User extends Model<User> {

    @TableId(type = IdType.ASSIGN_ID)
    private Long id;

    private String name;

    private Integer age;

    // 省略 getter 和 setter 方法
}

在上面的代码中,@TableId 注解的 type 属性被设置为 IdType.ASSIGN_ID ,这表示使用雪花算法来生成 ID。

总结

通过使用 @TableId 注解并将其 type 属性设置为 IdType.ASSIGN_ID ,可以解决 MybatisPlus 批量插入中的 ID 重复问题。雪花算法可以保证 ID 的唯一性,即使是批量插入也不会出现 ID 重复的问题。

常见问题解答

  • 问:为什么使用雪花算法生成 ID?
    答:雪花算法可以保证 ID 的唯一性,即使是在高并发场景下。

  • 问:是否可以指定机器 ID?
    答:可以,可以通过配置文件或代码的方式指定机器 ID。

  • 问:雪花算法生成的 ID 是有序的吗?
    答:是的,雪花算法生成的 ID 是有序的,可以按时间戳进行排序。

  • 问:雪花算法是否支持分布式部署?
    答:是的,雪花算法支持分布式部署,可以保证不同机器生成的 ID 唯一。

  • 问:如何使用 MybatisPlus 批量插入数据?
    答:可以使用 saveBatch 方法进行批量插入,具体用法可以参考官方文档。