mybatis-flex/docs/zh/fill.md
2023-03-25 13:58:29 +08:00

3.5 KiB
Raw Blame History

Entity 的主键配置

在 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 是 Generatorvalue 则代表的是使用的那个 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="uuid")
    private String otherId;

    //getter setter
}

当我们保存数据的时候Account 的 id 主键为自增,而 otherId 主键则通过 uuid 生成。

主键生成器

第 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
}

使用序列 Sequence 生成

@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;
    
}