在 Entity 类中,MyBatis-Flex 是使用 @Id
注解来标识主键的,如下代码所示:
@Table("tb_account")
public class Account {
// id 为自增主键
@Id(keyType = KeyType.Auto)
private Long id;
//getter setter
}
@Id
注解的内容如下:
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 种类型:
public enum KeyType {
/**
* 自增的方式
*/
Auto,
/**
* 通过执行数据库 sql 生成
* 例如:select SEQ_USER_ID.nextval as id from dual
*/
Sequence,
/**
* 通过 IKeyGenerator 生成器生成
*/
Generator,
/**
* 其他方式,比如在代码层用户手动设置
*/
None,
}
MyBatis-Flex 多主键就是在 Entity 类里有多个 @Id
注解标识而已,比如:
@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 算法生成数据库主键(了解更多信息请参阅源码)。
- snowFlakeId:通过雪花算法(
SnowFlakeIDKeyGenerator
)生成数据库主键。
这些主键生成器为 MyBatis-Flex 内置的,可直接使用:
@Table("tb_account")
public class Account {
@Id(keyType=KeyType.Generator, value=KeyGenerators.flexId)
private Long id;
//getter setter
}
第 1 步:编写一个类,实现 IKeyGenerator
接口,例如:
public class UUIDKeyGenerator implements IKeyGenerator {
@Override
public Object generate(Object entity, String keyColumn) {
return UUID.randomUUID().toString().replace("-", "");
}
}
第 2 步:注册 UUIDKeyGenerator
KeyGeneratorFactory.register("myUUID", new UUIDKeyGenerator());
第 3 步:在 Entity 里使用 "myUUID" 生成器:
@Table("tb_account")
public class Account {
@Id(keyType=KeyType.Generator, value="myUUID")
private String otherId;
//getter setter
}
@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 提供了一种全局配置的方式,代码如下:
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 只需要如下配置即可。
@Table("tb_account")
public class Account {
@Id
private Long id;
}