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

猜你喜欢

转载自www.cnblogs.com/haoxiu1004/p/9156480.html