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中有提供这些接口的:

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco }

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

原文地址:https://www.cnblogs.com/haoxiu1004/p/9156480.html

时间: 2024-11-02 02:32:58

java 动态操作数据库的相关文章

Java程序操作数据库SQLserver详解

数据库基本操作:增删改查(CRUD) crud介绍(增.删.改.查操作) CRUD是指在做计算处理时的增加(Create).查询(Retrieve)(重新得到数据).更新(Update)和删除(Delete)几个单记事的首字母简写.主要被用在描述软件系统中数据库或者持久层的基本操作功能. Create new records Rctricvc cxisting rccords Update existing records Delete existing records. 要对数据表进行增.删.

Java原生操作数据库(不使用框架)

1.引入数据库驱动的jar包 以通过maven引入mysql driver为例 1.1 到http://mvnrepository.com 搜索 mysql 1.2 复制所需maven配置文件到工程的 pom.xml <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency> <groupId>mysql</groupId> <artifactI

安卓java层操作数据库

一.在Android中查询数据库用到两个重要的类:  1.SQLiteDatabase:用来创建,删除,执行SQL命令,并执行其他常见的数据库管理任务. 2.query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy) 返回Cursor对象 table:数据库里边表的名称 columns:需要查询出来数据库

Java jdbc 操作数据库详解

原文地址https://www.cnblogs.com/huguodong/p/5910859.html JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用java语言编写的类和接口组成. 有了JDBC,向各种关系数据发送SQL语句就是一件很容易的事.换言之,有了JDBC API,就不必为访问Sybase数据库专门写一个程序,为访问Oracle数据库又专门写一个程序,或为访

07_数据库创建,添加c3p0操作所需的jar包,编写c3p0-config.xml文件,编写User.java,编写jdbcUtils.java实现操作数据库的模板工具类,UserDao编写,Dao

 1  创建day14数据库,创建user.sql表: A 创建数据库 day14 B 创建数据表 users create table users ( id int primary keyauto_increment, username varchar(20), password varchar(20) ); 2  添加依赖的jar包 c3p0-0.9.1.2.jar mysql-connection-java-5.0.8-bin.jar commons-beanutils-1.8.0.j

Java - 数据操作 - 数据库

1 判空 SELECT ENAME FROM EMP WHERE MGR IS NULL; 2 索引 不适合建立索引的情况 1. 很少使用或参考的列 2. 只有很少数据值的列 3. 定义为image, text, bit 数据类型的列 3 若空改变 1若为空则取2 oracle - nvl(expr1, expr2) mysql - ifnull(expr1, expr2) 4 建表 通过现有的表生成一个新的物理表 - create table 表名 as select 子句 where 子句

Django中利用type动态操作数据库表

场景分析: 后台MySql数据库保存了一大批按股票代码命名的数据表,每张表保存的是每只股票的日线数据. stock_000002 stock_600030 stock_600020 ...一共3000多个表. Django中如果要按股票代码展示每张表的数据,利用常规ORM模型变得非常困难,因为有3000多个表,就需要建3000多个模型. 解决办法: 1. 根据表名.字段等动态创建ORM表模型 def create_model(name, fields=None, app_label='', mo

Java Web的数据库操作(一)

一.JDBC技术 1.JDBC简介 JDBC是Java程序与数据库系统通信的标准API,它定义在JDK的API中,通过JDBC技术,Java程序可以非常方便地与各种数据库交互,JDBC在Java程序与数据库系统之间假期了一座桥梁. JDBC由一组用Java语言编写的类和接口组成,它对数据库的操作提供了基本方法,但由于数据库种类跟多且多有不同,所以对数据库的细节操作由数据库厂商进行实现,且厂商需要提供数据库的驱动程序,下图为Java程序与数据库相交互的示意图: 2.JDBC连接数据库的过程 l 

Java+MyEclipse+Tomcat (五)DAO和Java Bean实现数据库和界面分开操作

正如前面一篇文章的介绍,当使用Servlet提交表单和JSP数据库查询时,总是相互交叉着的处理,要么在JSP中通过<%...%>内嵌Java代码操作数据库,要么JSP中通过Post方法提交表单Form,在Java中通过Servlet获取请求/响应,再通过Java中out.println("<HTML>...")输出数据库中值. 此篇文章主要讲述通过DAO和Java Bean操作数据库,把链接数据库.数据库操作.前端界面显示分模块化实现.参考前文: Java+My