zoukankan      html  css  js  c++  java
  • mybatisplus运行时修改@TableName注解的schema值

    问题:

    最近碰到一个需求,使用mybatisplus时,因为权限原因,某张数据表需要用只读用户来读取,也就是说要指定schema,开发环境和测试环境的schema不一致,但是注解中的schema是写死的,不能根据配置文件来动态设置

     其他的环境不贴了,实体类如下:

    @Data
    @TableName(value = "RULE_BASIC_INFO",schema = "DEV_USER")
    @ApiModel(value = "规则对象 RULE_BASIC_INFO")
    public class XfRule implements Serializable{
    
        @TableId(type = IdType.AUTO)
        @ApiModelProperty(value = "主键ID", hidden = true)
        private Integer ruleId;
    
        @ApiModelProperty(value = "规则名称")
        private String ruleName;
    
    }
    View Code

    如上,数据库的表名为 RULE_BASIC_INFO,开发环境需要用DEV_USER来读取数据,测试环境需要用TEST_USER用户来读取数据

    解决方法:

    新建一个DynamicUser类如下:

    @Component
    public class DynamicUser implements BeanNameAware {
        private static final Logger log = LoggerFactory.getLogger(DynamicUser.class);
    
        @Value("${spring.profiles.active}")
        public String environment;
    
    
    
        @Override
        public void setBeanName(String name) {
            if("dev".equals(environment)){
                log.info("当前环境为:"+environment+" 使用默认user为DEV_USER");
                return;
            }
            log.info("当前环境为:"+environment+" 设置user为TEST_USER");
            TableName table = XfRule.class.getAnnotation(TableName.class);
            InvocationHandler invocationHandler = Proxy.getInvocationHandler(table);
            Field values = null;
            try {
                values = invocationHandler.getClass().getDeclaredField("memberValues");
                values.setAccessible(true);
                Map<String, Object> memberValues =(Map<String, Object>) values.get(invocationHandler);
                memberValues.put("schema","TEST_USER");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    View Code

    注意事项:

    不一定要实现BeanNameAware接口,然后写代码逻辑,但重要的是必须要在mybatisplus的com.baomidou.mybatisplus.core.metadata.TableInfoHelper.initTableName方法执行之前将schema的值设置到memberValues里,具体的代码位置及时机可以参考spring bean的生命周期自己设置。如果有因为bean加载顺序的导致在schema改变前就调用了sql,使得TableInfoHelper.initTableName方法提前初始化,可以使用

     @DependsOn注解手动干预

    这也只是其中之一的应用,用这个方法可以在运行时根据配置文件动态的修改注解中的值。

    生来奔走万山中,踏尽崎岖路自通
  • 相关阅读:
    Docker最简教程
    Linux下Docker快速部署LAMP
    NachosLab3同步与互斥机制模块实现
    另类P、V操作问题详细图解
    IE10兼容性问题(frameset的cols属性)
    oracle分页sql(rownum伪列使用)
    fusionchart图表遮挡Ext下拉控件或日期控件解决办法(IE下有问题firefox与chrome正常)
    js比较和逻辑运算符运算符
    JBPM4开发简介
    整合axis2到web项目中
  • 原文地址:https://www.cnblogs.com/NieXiaoHui/p/14741844.html
Copyright © 2011-2022 走看看