mybatis-plus动态设置 @TableName的schema属性

        做ep登录的长时间未登录禁止功能,运维提供的开发环境和生产环境 schema名称不一样,需要基于mybatis-plus动态修改@TableName的schema属性。

1、动态表

package com.xxx.eplogin.pojo.model;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import java.util.Map;

import com.baomidou.mybatisplus.annotation.TableName;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor;
import org.springframework.stereotype.Component;

/**
 * description:DynamicTable
 *
 * @author: lgq
 * @create: 2024-06-04 15:24
 */
@Component
@Slf4j
public class DynamicTable implements InstantiationAwareBeanPostProcessor {
    @Value("${spring.profiles.active}")
    public String environment;

    public static final String schema_uat = "schema_uat";
    public static final String schema_prod = "schema_prod";
    //只初始化一次
    private static  boolean isOk = false;


    @Override
    public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
        if (!isOk){
            // 后续可以通过注解进行注册放入集合中
            set(DemoA.class);
            set(DemoB.class);
            isOk = true;
        }
        return null;
    }

    private void set(Class<?>... classs){
        for (Class<?> aClass : classs) {
            TableName table = aClass.getAnnotation(TableName.class);
            //获取代理处理器
            InvocationHandler invocationHandler = Proxy.getInvocationHandler(table);
            Field values;
            try {
                // 过去私有 memberValues 属性
                values = invocationHandler.getClass().getDeclaredField("memberValues");
                values.setAccessible(true);

                // 获取实例的属性map
                Map<String, Object> memberValues =(Map<String, Object>) values.get(invocationHandler);
                // 修改属性值
                String schema = "prod".equals(environment) ? schema_prod: schema_uat;
                memberValues.put("schema", schema);

                log.info(String.format("当前环境为: %s,设置 %s 的schema为:%s ", environment,  aClass.getSimpleName(), schema));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    }

}

2、实体类

package com.xxx.eplogin.pojo.model;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;

import lombok.Data;

/**
 * description:demoA
 *
 * @author: lgq
 * @create: 2023-09-19 18:54
 */
@Data
@TableName(value = "demoa")
public class DemoA {
    /**
     * 用户标识
     */
    @TableField("a")
    private String a;

    /**
     * 用户名称
     */
    @TableField("b")
    private String b;

    /**
     * 参考用户,该字段用不到
     */
    @TableField("c")
    private String c;

    /**
     * 用户别名
     */
    @TableField("d")
    private String d;





}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值