mybatis-flex主键自动生成与手动设置兼顾的方法

最近在写新项目时使用了框架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依赖或采用其他方式获取注解信息!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值