主键策略介绍

  • IdType.AUTO:数据库自增,需要数据库支持自增长特性。

  • IdType.NONE:未设置主键生成策略,需要开发者手动设置ID。

  • IdType.ASSIGN_ID:使用雪花算法生成主键,适用于分布式系统,跨服务器部署。

  • IdType.ASSIGN_UUID:使用Java UUID生成主键。

  • IdType.ID_WORKER:已经被Mybatis-plus官方淘汰,推荐使用IdType.ASSIGN_ID代替。

  • IdType.ID_WORKER_STR:已经被Mybatis-plus官方淘汰,推荐使用IdType.ASSIGN_ID代替。

老版本配置

MyBatis-Plus支持在实体类属性上使用@TableId注解指定主键生成策略。当使用雪花算法生成唯一主键时,需要使用IdType.ID_WORKER属性值指定。在数据库中,字段类型可以选择CHAR(19)或者BIGINT。以下是生成主键的示例代码:

Copyimport com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;

@Data
public class User {
    // 指定使用雪花算法生成主键
    @TableId(type = IdType.ID_WORKER)
    private Long id;

    private String name;
    private Integer age;
}

新版本配置

在MyBatis-Plus 3.x版本及以上,IdType的枚举值支持了雪花算法的变体版本ID_WORKER_STR,它会根据字段类型自动选择CHAR(19)或VARCHAR(50)。实体类代码示例如下:

Copyimport com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;

@Data
public class User {
    // 指定使用雪花算法生成主键,并自动选择CHAR(19)或VARCHAR(50)
    @TableId(type = IdType.ASSIGN_ID)
    private String id;

    private String name;
    private Integer age;
}

全局配置

Mybatis-plus提供了全局配置主键的方式,即在代码中进行全局统一的主键配置,避免每个实体类中都需要单独配置主键的繁琐操作。具体步骤如下:

application.ymlapplication.properties中,设置全局的Mybatis-plus配置:

Copymybatis-plus:
  global-config:
    db-config:
      id-type: assign_id # 设置全局的主键生成策略为雪花算法

在实体类中,不需要再单独配置主键生成策略,可以直接使用注解@TableId指定主键属性,并通过value属性指定主键字段名称即可:

public class User {
  @TableId(value = "id")
  private Long id;

  private String name;

  private Integer age;

  private String email;
}

测试代码

@Test
void testInsertUser() {
    User user = new User();
    user.setName("king");
    user.setAge(19);
    int insert = userMapper.insert(user);
    System.out.println("insert = " + insert);
}

测试结果: image.png