• java 动态操作数据库


    问题描述:比如项目现在要使用在南京的8的区,这时这8个区分别建了一个数据库,但是只有一个项目,每个区的用户都使用这个项目进行登录

    问题难点:如何验证登录人属于哪个区,然后确认之后,如何进行数据库的切换;

    问题思路:除了8个数据库之外,在建一个数据库:数据库中包含的几张表:储存登录用户的信息等,直接上图理解

    一、数据库的建立

    h_right :

    h_role:红色表示登录人  所属哪一区

    h_role_right:  分配显示的菜单

    h_role_sysuser:用于分配区编号

    h_sysuser:用户信息

    以上所说的就是独立的一个数据库,加上8张之后就一共9个数据库了,至此数据库问题就先这样

    二、java代码如何实现

    1、项目使用的是shrio 进行安全处理

    2、数据库的配置文件的编辑

    两个配置文件:第一个:专门用于所有数据库的配置信息:

    最重要的就是下面的数据库Key值的配置

    3、如何动态切换数据库,JAVA中有提供这些接口的:

    AbstractRoutingDataSource

    这个时候要使用Spring的依赖注入和控制翻转了

    @Aspect
    @Component
    public class LogAop implements Ordered{
    @Pointcut("execution(* com.tangbo..*(..))")
    public void recordLog(){}
    //@Pointcut("execution(* com.tangbo.esmsys..*.*(..))")
    //定义在service包里的任意方法的执行:
    @Pointcut("execution(* com.tangbo.esmsys..*.*(..)) || execution(* com.tangbo.oprm.context..*.*(..)) || execution(* com.tangbo.oprm.institution..*.*(..))")
    public void recordLog1(){}
    @Pointcut("execution(* com.tangbo.oprm.right..*.*(..)) || execution(* com.tangbo.oprm.role..*.*(..)) || execution(* com.tangbo.oprm.sysuser..*.*(..)) ")
    public void recordLogBySysUser(){}
    @Before("recordLog1()")
    public void before(JoinPoint call){
    String className = call.getTarget().getClass().getName();
    String methodName = call.getSignature().getName();
    String sessionId = (String) SecurityUtils.getSubject().getSession().getId();
    String dataSource = (String) SecurityUtils.getSubject().getSession().getAttribute(sessionId+"dataSource");
    if(dataSource == null){
    dataSource = (String) SecurityUtils.getSubject().getSession().getAttribute("datas");

    }
    DataSourceContextHolder.setDBType(dataSource);
    String db =DataSourceContextHolder.getDBType();
    System.out.println("开始执行:"+className+"."+methodName+"()方法..."+"选择的数据库为:"+ db);
    }
    @AfterThrowing("recordLog()")
    public void afterThrowing(JoinPoint call){
    String className = call.getTarget().getClass().getName();
    String methodName = call.getSignature().getName();
    System.out.println(className+"."+methodName+"()方法抛出了异常...");
    }
    @AfterReturning("recordLog()")
    public void afterReturn(JoinPoint call){
    String className = call.getTarget().getClass().getName();
    String methodName = call.getSignature().getName();
    System.out.println(className+"."+methodName+"()方法正常执行结束...");
    }
    @After("recordLog()")
    public void after(JoinPoint call){
    String className = call.getTarget().getClass().getName();
    String methodName = call.getSignature().getName();
    DataSourceContextHolder.clearDBType();
    System.out.println(className+"."+methodName+"()最终执行步骤(finally)...");
    }
    @Before("recordLogBySysUser()")
    public void beforeBySystem(JoinPoint call){
    String className = call.getTarget().getClass().getName();
    String methodName = call.getSignature().getName();
    DataSourceContextHolder.setDBType("huawenchuan1");
    String db =DataSourceContextHolder.getDBType();
    System.out.println("开始执行:"+className+"."+methodName+"()方法..."+"选择的数据库为:"+ db);
    }
    @Override
    public int getOrder() {
    // TODO Auto-generated method stub
    return 1;
    }

    }

    解释:时候Spring的注解,实现在登录的时候使用哪个数据库,然后验证登录人属于哪个区之后,开始在调用每个接口之前,设置好要使用的数据库

    梦想这东西和经典一样,永远不会随时间而褪色,反而更加珍贵!
  • 相关阅读:
    摘记
    【题解】网格 & Single Cut of Failure(trick:答案上界)
    题解 CF1404C 【Fixed Point Removal】
    Linux IO模型知识梳理
    Java IO模型知识梳理
    如何回答什么是线程安全?
    MySQL主从复制与备份
    MySQL的高性能索引策略
    CAS(乐观锁)的原理解析
    Java虚拟机的类加载机制
  • 原文地址:https://www.cnblogs.com/haoxiu1004/p/9156480.html
Copyright © 2020-2023  润新知