mybatisplus使用雪花算法插入数据后怎么获取id
时间: 2025-07-20 21:22:48 浏览: 2
<think>我们正在使用MyBatis-Plus插入数据,并采用雪花算法(Snowflake)生成ID。用户想知道在插入后如何获取生成的ID。
根据引用[1]:在MyBatis(包括MyBatis-Plus)中,插入操作后,生成的ID会直接映射到传入的实体对象中。也就是说,当我们执行插入操作后,传入的实体对象的ID属性会被自动设置为数据库生成的ID值。
在MyBatis-Plus中,默认的ID生成策略是雪花算法(如果配置了的话),并且插入后会自动将生成的ID回填到实体对象中。
具体操作步骤:
1. 确保实体类中的ID字段(通常标记为@TableId)的生成策略是雪花算法(或者全局配置了雪花算法)。
2. 执行插入操作(如使用MyBatis-Plus的insert方法)。
3. 插入后,实体对象的ID字段会被自动赋值,我们可以直接从该对象中获取ID。
示例代码:
实体类:
```java
@Data
public class User {
@TableId(type = IdType.ASSIGN_ID) // 使用雪花算法(ASSIGN_ID是默认策略,通常就是雪花算法)
private Long id;
private String name;
private Integer age;
}
```
Service或Mapper中:
```java
User user = new User();
user.setName("test");
user.setAge(20);
userMapper.insert(user); // 插入后,user的id字段会被自动赋值
// 此时,user.getId() 就是生成的雪花ID
System.out.println("Generated ID: " + user.getId());
```
注意:在MyBatis-Plus中,默认的ID生成策略就是雪花算法(IdType.ASSIGN_ID),所以通常我们不需要特别配置。但在多实例部署时,需要注意雪花算法的workId和dataCenterId的配置,以避免ID重复(如引用[2]所述)。
因此,获取生成的ID非常简单:在插入后直接通过实体对象的getId()方法即可。
引用[1]中提到了使用@SelectKey注解的方式,但那是MyBatis原生的方式。在MyBatis-Plus中,我们通常不需要这样写,因为MyBatis-Plus已经帮我们处理好了。
另外,引用[3]提到了mybatis-plus和mybatis-plus-boot-starter的区别,但这里我们主要关注的是插入后获取ID,所以这个引用不是直接相关的。
总结:插入后,生成的ID已经回填到实体对象的ID字段中,直接获取即可。
生成相关问题:
1. 如何配置MyBatis-Plus的雪花算法生成器?
2. 在多实例部署时,如何避免雪花算法生成的ID重复?
3. MyBatis-Plus中还有哪些ID生成策略?
4. 除了自动回填ID,MyBatis-Plus还有哪些自动填充功能?</think>### MyBatis-Plus 插入数据后获取雪花算法生成的 ID
在 MyBatis-Plus 中使用雪花算法生成 ID 后,获取生成的 ID 非常简单。以下是具体实现步骤:
#### 1. **配置雪花算法 ID 生成器**
在实体类的 ID 字段上添加注解:
```java
@Data
public class User {
@TableId(type = IdType.ASSIGN_ID) // 使用雪花算法
private Long id;
private String name;
}
```
或全局配置(在 `application.yml` 中):
```yaml
mybatis-plus:
global-config:
db-config:
id-type: assign_id # 全局雪花算法
```
#### 2. **插入数据并获取 ID**
执行插入操作后,**生成的 ID 会自动回填到实体对象**:
```java
User user = new User();
user.setName("John");
userMapper.insert(user); // 插入操作
// 直接获取回填的ID (关键步骤)
Long generatedId = user.getId();
System.out.println("生成的ID:" + generatedId);
```
**原理**:
MyBatis-Plus 在执行插入操作后,会自动将数据库生成的 ID(包括雪花算法生成的 ID)映射回实体对象的 `@TableId` 字段[^1]。
---
#### 常见问题解决
1. **多实例部署 ID 重复**
多台机器部署时需自定义 `workId` 和 `dataCenterId`:
```java
@Bean
public IdentifierGenerator idGenerator() {
return new CustomIdGenerator(1, 1); // 自定义机器ID和数据中心ID
}
```
避免雪花算法在分布式环境下产生重复 ID[^2]。
2. **ID 未回填的检查项**:
- 确认实体类 ID 字段有 `@TableId`
- 检查是否误用 `mybatis-plus` 而非 `mybatis-plus-boot-starter`(后者支持自动注入)[^3]
- 确保字段类型为 `Long`(雪花算法 ID 是 64 位整数)
---
### 示例流程
```mermaid
graph TD
A[创建实体对象] --> B[执行insert方法]
B --> C[MyBatis-Plus调用雪花算法生成ID]
C --> D[将ID写入数据库]
D --> E[自动回填ID到实体对象]
E --> F[通过entity.getId获取ID]
```
### 总结
- **核心操作**:插入后直接从实体对象调用 `getId()`
- **依赖要求**:使用 `mybatis-plus-boot-starter` 确保自动配置生效[^3]
- **分布式场景**:需自定义 `IdentifierGenerator` 避免 ID 冲突[^2]
阅读全文
相关推荐


















