最近在写新项目时使用了框架mybatis-flex(对标mybatis-plus),数据库是pgsql,在插入数据的时候,我们有时候希望主键是自动生成的,有时候希望主键是我们手动插入的
可以进行如下配置:
一:先配置mybatis-flex的主键生成规则
public class FlexKeyGenerator implements IKeyGenerator {
private static final String method = "get";
@Override
public Object generate(Object entity, String keyColumn) {
Class<?> clazz = entity.getClass();
Field[] fields = ReflectUtil.getFields(clazz);
for (Field field : fields) {
field.setAccessible(true);
if (field.getAnnotation(Id.class) != null) {
String getMethodName = method + field.getName();
Method method = ReflectUtil.getMethodByNameIgnoreCase(entity.getClass(), getMethodName);
String id = null;
try {
id = (String) method.invoke(entity);
} catch (Exception e) {
e.printStackTrace();
throw new IllegalArgumentException("找不到实体类的get方法!"+"方法名是:"+getMethodName);
}
if (StrUtil.isBlank(id)) {
return IdUtil.fastSimpleUUID();
} else {
return id;
}
}
}
throw new IllegalArgumentException("请检查实体类是否指定了Id");
}
}
上面方法的返回值就是实体类的id,逻辑大概是遍历实体类字段,当发现有@Id注解(flex官方规定将实体类的主键加上此注解)时,先判断该字段是否为空,如果为空的话就返回一个UUID,如果不为空就返回原数据,这就实现了在新增数据时,如果我们给主键设置了值那么就会以我们设置的值为准,如果没有给主键赋值,就使用自动生成的值
二:将刚刚配置的id生成规则注册上去
@PostConstruct
public void setFlexConfig() {
FlexGlobalConfig globalConfig = FlexGlobalConfig.getDefaultConfig();
// 关闭banner
globalConfig.setPrintBanner(false);
FlexGlobalConfig.KeyConfig keyConfig = new FlexGlobalConfig.KeyConfig();
keyConfig.setKeyType(KeyType.Generator);
//设置默认的id生成规则为smart
keyConfig.setValue("smart");
FlexGlobalConfig.getDefaultConfig().setKeyConfig(keyConfig);
//设置数据库正常时的值
globalConfig.setNormalValueOfLogicDelete("0");
//设置数据已被删除时的值
globalConfig.setDeletedValueOfLogicDelete("1");
//注册刚刚配置的id生成规则,并起名叫smart
KeyGeneratorFactory.register("smart", new FlexKeyGenerator());
}
三:实体类在主键字段加上@Id注解就可以使用了
注:此代码借助了hutool工具类获取注解信息,使用时需导入hutool依赖或采用其他方式获取注解信息!