# 主键策略设置

# 主键自增

适用于:mysql自增主键、sqlserver自增主键、oracle(触发器)

数据库主键设置自增后,这样设置:

// strategy = PkStrategy.INCREMENT 自增策略
@Table(name = "t_user", pk = @Pk(name = "id", strategy = PkStrategy.INCREMENT))
public class TUser {
}

这样在做insert后,id会自动填充自增后的值。

# 主键使用sequence(oracle)

适用于oracle表序列

-- 创建表sequence,名字为t_user_seq
create sequence t_user_seq start with 1 increment by 1;

使用如下注解:

@Table(name = "t_user", pk = @Pk(name = "id", sequenceName = "t_user_seq"))
public class TUser {
}

# 主键使用uuid

数据库主键是varchar类型,insert后自动填充uuid,并返回。

@Table(name = "log", pk = @Pk(name = "log_id", strategy = PkStrategy.UUID/*配置主键UUID*/))
public class Log {
    private String logId;
}

这样在做insert后,id字段会自动填充uuid。

  • 注:uuid的生成方式是调用数据库底层实现,如MySql的实现方式为: SELECT UUID()

# 自定义uuid

如果不希望使用底层数据库的uuid,可自定义自己实现,实现方式如下:

  • 首先设置strategy = PkStrategy.NONE表示无策略
// strategy = PkStrategy.NONE 无策略
@Table(name = "log", pk = @Pk(name = "log_id", strategy = PkStrategy.NONE))
public class Log {
    private String logId;
}
  • 创建一个类UUIDFill并继承CustomIdFill
public class UUIDFill extends CustomIdFill<String> {

    @Override
    public String getColumnName() {
        return "log_id"; // 作用在id字段上
    }

    @Override
    protected Object getFillValue(String defaultValue) {
        return Optional.ofNullable(defaultValue).orElse(UUID.randomUUID().toString()); // 自定义的uuid生成方式
    }
}
  • 在application.properties中添加
# key:填充器全路径类名,value:构造函数参数值,没有可不填
mybatis.fill.com.xx.aa.UUIDFill=

格式为mybatis.fill.类路径=构造参数(没有可不填)

到此已经可以了,当进行insert操作后,id字段会自动插入自定义的uuid。同时id值回写到实体类中,可直接entity.getLogId()获取。