mirror of
https://gitee.com/mybatis-flex/mybatis-flex.git
synced 2025-12-06 08:38:26 +08:00
193 lines
4.3 KiB
Markdown
193 lines
4.3 KiB
Markdown
# @Id 主键的使用
|
||
|
||
在 Entity 类中,MyBatis-Flex 是使用 `@Id` 注解来标识主键的,如下代码所示:
|
||
|
||
```java 5
|
||
@Table("tb_account")
|
||
public class Account {
|
||
|
||
// id 为自增主键
|
||
@Id(keyType = KeyType.Auto)
|
||
private Long id;
|
||
|
||
//getter setter
|
||
}
|
||
```
|
||
|
||
`@Id` 注解的内容如下:
|
||
|
||
```java
|
||
public @interface Id {
|
||
|
||
/**
|
||
* ID 生成策略,默认为 none
|
||
*
|
||
* @return 生成策略
|
||
*/
|
||
KeyType keyType() default KeyType.None;
|
||
|
||
/**
|
||
* 若 keyType 类型是 sequence, value 则代表的是
|
||
* sequence 序列的 sql 内容
|
||
* 例如:select SEQ_USER_ID.nextval as id from dual
|
||
*
|
||
* 若 keyType 是 Generator,value 则代表的是使用的那个 keyGenerator 的名称
|
||
*
|
||
*/
|
||
String value() default "";
|
||
|
||
|
||
/**
|
||
* sequence 序列执行顺序
|
||
* 是在 entity 数据插入之前执行,还是之后执行,之后执行的一般是数据主动生成的 id
|
||
*
|
||
* @return 执行之前还是之后
|
||
*/
|
||
boolean before() default true;
|
||
}
|
||
```
|
||
|
||
keyType 为主键的生成方式,KeyType 有 4 种类型:
|
||
|
||
```java
|
||
public enum KeyType {
|
||
|
||
/**
|
||
* 自增的方式
|
||
*/
|
||
Auto,
|
||
|
||
/**
|
||
* 通过执行数据库 sql 生成
|
||
* 例如:select SEQ_USER_ID.nextval as id from dual
|
||
*/
|
||
Sequence,
|
||
|
||
/**
|
||
* 通过 IKeyGenerator 生成器生成
|
||
*/
|
||
Generator,
|
||
|
||
/**
|
||
* 其他方式,比如在代码层用户手动设置
|
||
*/
|
||
None,
|
||
}
|
||
```
|
||
|
||
## 多主键、复合主键
|
||
|
||
MyBatis-Flex 多主键就是在 Entity 类里有多个 `@Id` 注解标识而已,比如:
|
||
|
||
```java
|
||
@Table("tb_account")
|
||
public class Account {
|
||
|
||
@Id(keyType = KeyType.Auto)
|
||
private Long id;
|
||
|
||
@Id(keyType = KeyType.Generator, value = KeyGenerators.uuid)
|
||
private String otherId;
|
||
|
||
//getter setter
|
||
}
|
||
```
|
||
当我们保存数据的时候,Account 的 id 主键为自增,而 otherId 主键则通过 uuid 生成。
|
||
|
||
## 内置主键生成器
|
||
|
||
MyBatis-Flex 内置了三种主键生成器,他们的名称都定义在 `KeyGenerators` 类里:
|
||
|
||
- **uuid**:通过 `UUIDKeyGenerator` 生成 UUID 作为数据库主键。
|
||
- **flexId**:独创的 FlexID 算法生成数据库主键(了解更多信息请参阅[源码](https://gitee.com/mybatis-flex/mybatis-flex/blob/main/mybatis-flex-core/src/main/java/com/mybatisflex/core/keygen/impl/FlexIDKeyGenerator.java))。
|
||
- **snowFlakeId**:通过雪花算法(`SnowFlakeIDKeyGenerator`)生成数据库主键。
|
||
|
||
这些主键生成器为 MyBatis-Flex 内置的,可直接使用:
|
||
|
||
```java 4
|
||
@Table("tb_account")
|
||
public class Account {
|
||
|
||
@Id(keyType=KeyType.Generator, value=KeyGenerators.flexId)
|
||
private Long id;
|
||
|
||
//getter setter
|
||
}
|
||
```
|
||
|
||
## 自定义主键生成器
|
||
|
||
第 1 步:编写一个类,实现 `IKeyGenerator` 接口,例如:
|
||
|
||
```java
|
||
public class UUIDKeyGenerator implements IKeyGenerator {
|
||
|
||
@Override
|
||
public Object generate(Object entity, String keyColumn) {
|
||
return UUID.randomUUID().toString().replace("-", "");
|
||
}
|
||
}
|
||
```
|
||
|
||
第 2 步:注册 UUIDKeyGenerator
|
||
|
||
```java
|
||
static {
|
||
KeyGeneratorFactory.register("myUUID", new UUIDKeyGenerator());
|
||
}
|
||
```
|
||
|
||
第 3 步:在 Entity 里使用 "myUUID" 生成器:
|
||
|
||
```java
|
||
@Table("tb_account")
|
||
public class Account {
|
||
|
||
@Id(keyType=KeyType.Generator, value="myUUID")
|
||
private String otherId;
|
||
|
||
//getter setter
|
||
}
|
||
```
|
||
|
||
|
||
## 使用序列 Sequence 生成
|
||
|
||
```java
|
||
@Table("tb_account")
|
||
public class Account {
|
||
|
||
@Id(keyType=KeyType.Sequence, value="select SEQ_USER_ID.nextval as id from dual")
|
||
private Long id;
|
||
|
||
}
|
||
```
|
||
|
||
## 全局配置
|
||
|
||
一般的项目中,通常是许多的 Entity 使用同一个数据库,同时使用一种主键生成方式,比如都使用 自增,
|
||
或者都使用通过序列(Sequence)生成,此时,我们是没有必要为每个 Entity 单独配置一样内容的。
|
||
|
||
MyBatis-Flex 提供了一种全局配置的方式,代码如下:
|
||
|
||
```java
|
||
FlexGlobalConfig.KeyConfig keyConfig = new FlexGlobalConfig.KeyConfig();
|
||
keyConfig.setKeyType(KeyType.Sequence);
|
||
keyConfig.setValue("select SEQ_USER_ID.nextval as id from dual")
|
||
keyConfig.setBefore(true);
|
||
|
||
FlexGlobalConfig.getDefaultConfig().setKeyConfig(keyConfig);
|
||
```
|
||
|
||
此时,Entity 类 Account.java 只需要如下配置即可。
|
||
|
||
```java
|
||
@Table("tb_account")
|
||
public class Account {
|
||
|
||
@Id
|
||
private Long id;
|
||
|
||
}
|
||
```
|