java dbtype_java 动态操作数据库

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

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

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

一、数据库的建立

h_right :

29ccb302d6d8e20677aee49f8d8cce75.png

h_role:

9110d20a578d2562c464c2b50742f307.png红色表示登录人  所属哪一区

h_role_right:

26bfa3cf8b088143ca119e2ba3d07c37.png分配显示的菜单

h_role_sysuser:

a1a014cc704013fe7c15f786e8faac02.png用于分配区编号

h_sysuser:

81a21a948da88e6f13c9f00b5e4664bb.png用户信息

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

二、java代码如何实现

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

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

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

eccf0fc1f3c63dcd2d58e9e812a45198.png

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

9d4cd902badc94cc8c1882d6c8074aa9.png

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的注解,实现在登录的时候使用哪个数据库,然后验证登录人属于哪个区之后,开始在调用每个接口之前,设置好要使用的数据库

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值