mybatisplus 自动生成id
时间: 2025-04-19 17:34:50 浏览: 54
<think>嗯,我现在要了解MyBatis-Plus自动生成ID的机制。首先,我需要知道在数据库中,主键ID的生成方式有哪些常见的策略,比如自增、UUID、雪花算法等。MyBatis-Plus作为MyBatis的增强工具,应该对这些策略有支持。
用户的问题是关于MyBatis-Plus如何自动生成ID,所以可能需要查看官方文档或者相关教程。我记得MyBatis-Plus提供了注解@TableId来指定主键生成策略。比如@TableId(type = IdType.AUTO)可能就是自增主键,但具体支持哪些类型呢?
然后,不同的数据库对自增的实现可能不同,比如MySQL有AUTO_INCREMENT,而PostgreSQL使用SERIAL或者IDENTITY类型。MyBatis-Plus的自动生成是否兼容这些差异?或者是否需要额外配置?
另外,还有雪花算法生成的分布式ID,这可能涉及到IdType.ASSIGN_ID或者IdType.ASSIGN_UUID。需要确认这些策略的使用方法和适用场景。比如ASSIGN_ID是基于雪花算法,生成的是Long类型的ID,而ASSIGN_UUID则是字符串形式的UUID。
还需要考虑在实体类中如何正确使用这些注解。例如,是否需要在字段上添加@TableId注解,并指定type属性。如果没有指定,MyBatis-Plus的默认策略是什么?
可能还需要示例代码来说明不同的配置方式,比如在application.yml中配置全局的主键策略,或者在实体类中单独指定。同时,要注意不同策略下插入操作时的行为,比如使用自增策略时,插入后是否能获取到生成的ID。
此外,用户可能会遇到问题,比如配置了自增但数据库不支持,或者分布式环境下ID冲突的情况。这时候需要如何排查和解决?可能需要检查数据库的自增设置,或者调整生成策略为分布式友好的算法如雪花ID。
总结一下,回答需要涵盖MyBatis-Plus支持的ID生成策略、如何配置(注解和全局)、不同数据库的注意事项、以及常见问题的解决方法。同时,结构要清晰,分点说明,帮助用户逐步理解。</think>MyBatis-Plus 的自动生成 ID 功能主要通过主键生成策略实现,以下是逐步说明:
---
### 一、核心注解 `@TableId`
在实体类中使用 `@TableId` 注解标记主键字段,通过 `type` 属性指定生成策略:
```java
@TableId(type = IdType.AUTO)
private Long id;
```
---
### 二、支持的 ID 生成策略(`IdType` 枚举)
1. **`AUTO`**
- 数据库自增 ID
- 要求:数据库字段需设置自增(如 MySQL 的 `AUTO_INCREMENT`)
- 示例配置:
```sql
CREATE TABLE user (
id BIGINT(20) NOT NULL AUTO_INCREMENT,
...
)
```
2. **`ASSIGN_ID`**(默认策略)
- 雪花算法生成 `Long` 类型 ID
- 特点:分布式环境下唯一、有序
- 无需数据库支持,由 MyBatis-Plus 自动生成
3. **`ASSIGN_UUID`**
- 生成 32 位 UUID 字符串(不含短横线)
- 示例:`d89f8e6e5a7d4a2e8d0f3b7c1e6a3d1f`
4. **`NONE`**
- 不自动生成,需手动设置 ID
5. **`INPUT`**
- 用户自定义 ID(插入前需显式赋值)
---
### 三、全局配置(可选)
在 `application.yml` 中设置默认策略:
```yaml
mybatis-plus:
global-config:
db-config:
id-type: assign_id # 默认使用雪花算法
```
---
### 四、插入行为示例
```java
User user = new User();
user.setName("John");
// 未手动设置 id
userMapper.insert(user);
// 插入后自动回填生成的 id
System.out.println(user.getId());
```
---
### 五、注意事项
1. **`AUTO` 策略需数据库支持**
- MySQL/Oracle 等支持自增,PostgreSQL 需使用 `SERIAL` 或 `IDENTITY` 类型
2. **`ASSIGN_ID` 的数值范围**
- 生成的是 64 位 Long 类型数值,前端需使用字符串类型避免精度丢失
3. **分布式环境推荐**
- 优先选择 `ASSIGN_ID`(雪花算法)避免 ID 冲突
---
### 六、扩展:自定义 ID 生成器
实现 `IdentifierGenerator` 接口可定制生成逻辑:
```java
@Component
public class CustomIdGenerator implements IdentifierGenerator {
@Override
public Number nextId(Object entity) {
// 返回自定义 ID(如时间戳+随机数)
return System.currentTimeMillis() + RandomUtil.randomInt(1000);
}
}
```
---
通过上述配置,MyBatis-Plus 可灵活适配不同场景的 ID 生成需求,兼顾单机与分布式环境。
阅读全文
相关推荐




















