在我们刚开始学习编程到初步使用框架开发时,动手去操作数据库对数据进行增删查改就觉得很神奇了,

那么我们的框架是不是只能连接一个数据库呢,当然不是,百度上有许多关于这方面的资料可以学习

jdbc的配置,这里我只是简单的用1,2区分

#oracledriver2=oracle.jdbc.driver.OracleDriverurl2=jdbc:oracle:thin:@localhost:1521:ORCLusername2=rootpassword2=123456

#mysql1driver1=com.mysql.jdbc.Driverurl1=jdbc:mysql://localhost:3306/jxlz?useUnicode=true&characterEncoding=UTF-8&autoReconnect=trueusername1=rootpassword1=123456

#mysql2driver=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/gslz?useUnicode=true&characterEncoding=UTF-8&autoReconnect=trueusername=rootpassword=123456

这是mybatis的配置,有点多配合上下文及注释还是可以理解的

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:cache="http://www.springframework.org/schema/cache"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.1.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.1.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc-4.0.xsdhttp://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"><!-- 自动扫描 --><context:component-scan base-package="com.pskj" annotation-config="true"/><!-- 扫描机制以com.pskj开头的类直接加入到Spring容器管理器中 --><!-- 引入配置文件 数据库--><bean id="propertyConfigurer"class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"><property name="location" value="classpath:jdbc.properties" /></bean><bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"destroy-method="close"><property name="driverClassName" value="${driver}" /><property name="url" value="${url}" /><property name="username" value="${username}" /><property name="password" value="${password}" /><!-- 初始化连接大小 --><property name="initialSize" value="${initialSize}"></property><!-- 连接池最大数量 --><property name="maxActive" value="${maxActive}"></property><!-- 连接池最大空闲 --><property name="maxIdle" value="${maxIdle}"></property><!-- 连接池最小空闲 --><property name="minIdle" value="${minIdle}"></property><!-- 获取连接最大等待时间 --><property name="maxWait" value="${maxWait}"></property></bean><bean id="dataSource2" class="org.apache.commons.dbcp.BasicDataSource"destroy-method="close"><property name="driverClassName" value="${driver1}" /><property name="url" value="${url1}" /><property name="username" value="${username1}" /><property name="password" value="${password1}" /><!-- 初始化连接大小 --><property name="initialSize" value="${initialSize}"></property><!-- 连接池最大数量 --><property name="maxActive" value="${maxActive}"></property><!-- 连接池最大空闲 --><property name="maxIdle" value="${maxIdle}"></property><!-- 连接池最小空闲 --><property name="minIdle" value="${minIdle}"></property><!-- 获取连接最大等待时间 --><property name="maxWait" value="${maxWait}"></property></bean><bean id="dataSource3" class="org.apache.commons.dbcp.BasicDataSource"destroy-method="close"><property name="driverClassName" value="${driver2}" /><property name="url" value="${url2}" /><property name="username" value="${username2}" /><property name="password" value="${password2}" /></bean><!-- 动态DataSource配置    --><bean id="dynamicDataSource" class="com.pskj.GSLZ.utils.dataSource.DynamicDataSource"><!--默认数据源  --><property name="defaultTargetDataSource" ref="dataSource3"/><property name="targetDataSources"><map key-type="java.lang.String"><entry key="dataSource" value-ref="dataSource"/><entry key="dataSource2" value-ref="dataSource2"/><entry key="dataSource3" value-ref="dataSource3"/></map></property></bean><bean id="dataSourceAspect" class="com.pskj.GSLZ.utils.dataSource.DataSwitchAop" /><aop:config><aop:aspect ref="dataSourceAspect" ><!-- 拦截所有service方法 --><!--我这里实在service上面加的注解,可自行调换  --><aop:pointcut id="dataSourcePointcut" expression="execution(* com.pskj.GSLZ.service..*.*(..))"/><aop:before pointcut-ref="dataSourcePointcut" method="intercept" /></aop:aspect></aop:config><!--启动对@AspectJ注解的支持 , proxy-target-class设置为true表示通知spring使用cglib而不是jdk的来生成代理方法,这样AOP可以拦截到Controller --><aop:aspectj-autoproxy proxy-target-class="true"/><!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 --><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><!-- 数据库连接池 --><!--<property name="dataSource" ref="dataSource" />--><property name="dataSource" ref="dynamicDataSource" /><!-- 自动扫描mapping.xml文件 --><property name="mapperLocations" value="classpath:mapper/*/*.xml"></property><!--加载mybatis的全局配置文件--><property name="configLocation" value="classpath:mybatis-config.xml"></property></bean><!-- DAO接口所在包名,Spring会自动查找其下的类 --><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.pskj.GSLZ.dao" /><property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property></bean><!-- sql会话模版 --><bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate" scope="prototype"><constructor-arg ref="sqlSessionFactory"/></bean><!-- (事务管理)transaction manager, use JtaTransactionManager for global tx --><bean id="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><!--<property name="dataSource" ref="dataSource" />--><property name="dataSource" ref="dynamicDataSource" /></bean><!-- cacheManager工厂类,指定ehcache.xml的位置 --><bean id="ehCacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"><property name="configLocation" value="classpath:ehcache.xml" /><property name="shared" value="true"/></bean></beans>

还有这个AspectJ等下写类的时候需要用到它的某些方法

 <dependency><groupId>aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.5.2</version></dependency>

现在开始写可以切换数据源的工具类了

DataSource类:

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;//设置注解
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.TYPE})
@Documented
public @interface DataSource {String value() default "";
}

DataSwitchAop类:

import java.lang.reflect.Method;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.reflect.MethodSignature;
import com.njwangbo.util.DynamicDataSourceHolder;public class DataSwitchAop {/*** 拦截目标方法,获取由@DataSource指定的数据源标识,设置到线程存储中以便切换数据源* * @param point* @throws Exception*/public void intercept(JoinPoint point) throws Exception {Class<?> target = point.getTarget().getClass();MethodSignature signature = (MethodSignature) point.getSignature();// 默认使用目标类型的注解,如果没有则使用其实现接口的注解for (Class<?> clazz : target.getInterfaces()) {resolveDataSource(clazz, signature.getMethod());}resolveDataSource(target, signature.getMethod());}/*** 提取目标对象方法注解和类型注解中的数据源标识* * @param clazz* @param method*/private void resolveDataSource(Class<?> clazz, Method method) {try {Class<?>[] types = method.getParameterTypes();// 默认使用类型注解if (clazz.isAnnotationPresent(DataSource.class)) {DataSource source = clazz.getAnnotation(DataSource.class);DynamicDataSourceHolder.setDataSource(source.value());}// 方法注解可以覆盖类型注解Method m = clazz.getMethod(method.getName(), types);if (m != null && m.isAnnotationPresent(DataSource.class)) {DataSource source = m.getAnnotation(DataSource.class);DynamicDataSourceHolder.setDataSource(source.value());}} catch (Exception e) {System.out.println(clazz + ":" + e.getMessage());}}
}

DynamicDataSourceHolder 类:

public class DynamicDataSourceHolder {private static final ThreadLocal<String> dataSourceKey = new InheritableThreadLocal<String>();public static String getDataSource() {return dataSourceKey.get();}public static void setDataSource(String dataSource) {dataSourceKey.set(dataSource);}public static void clearDataSource() {dataSourceKey.remove();}}

DynamicDataSource类:

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;  public class DynamicDataSource extends AbstractRoutingDataSource {  @Overrideprotected Object determineCurrentLookupKey() {return DynamicDataSourceHolder.getDataSource();}
}  

控制层和sql语句已经写好

这是service的代码

    //测试@DataSource(value = "dataSource2")public PageData listById(PageData pd){return (PageData) dao.findForObject("UseMapper.listById",pd);}

@DataSource(value = "dataSource2")我们只要改变这个注解里的value值对应我们想查的数据源即可,经测试无论是mysql还是oracle都成功运行

转载于:https://www.cnblogs.com/magepi/p/10387938.html

ssm使用注解配置多数据源相关推荐

  1. SSM项目_配置双数据源

    近日项目中因为涉及到一个需求是A系统某表的数据要与B系统的某表数据在数据上出现不一致的情况,需要做一个数据比对功能,这时候就涉及到两个系统的数据库的数据比对. 方案一,将A系统的数据导出到Excel文 ...

  2. DB数据源之SpringBoot+MyBatis踏坑过程(三)手工+半自动注解配置数据源与加载Mapper.xml扫描...

    DB数据源之SpringBoot+MyBatis踏坑过程(三)手工+半自动注解配置数据源与加载Mapper.xml扫描 liuyuhang原创,未经允许禁止转载    系列目录连接 DB数据源之Spr ...

  3. mysql-plus多数据库_Springboot+mybatisplus+mysql配置多数据源(注解版)

    1.添加依赖,最关键的两个依赖是后面两个"druid依赖"和"配置动态数据源"(已标红),其他"非主要"依赖可按自身实际开发环境进行选择. ...

  4. springmvc+mybatis多数据源配置,AOP注解动态切换数据源

    springmvc与springboot没多大区别,springboot一个jar包配置几乎包含了所有springmvc,也不需要繁琐的xml配置,springmvc需要配置多种jar包,需要繁琐的x ...

  5. springboot2.0.5+jpa多数据源配置and注解形式多数据源切换

    1.首先配置数据源连接总装类DataSourcesConfig package com.cpic.dataSources;import org.springframework.beans.factor ...

  6. Spring Boot + Mybatis 配合 AOP 和注解实现动态数据源切换配置

    Spring Boot + Mybatis 配合 AOP 和注解实现动态数据源切换配置 前言: 1. 数据库准备: 2. 环境准备: 3.代码部分 4. 测试: 5.等等 6.配合注解实现 7 .测试 ...

  7. 一步步教你搭建SSM整合+前提配置超详细版(IDEA版本)

    为了应付学校的实训课作业,开始自学SSM框架-- 我!太南了!! 所以,从下午两点写到现在晚上九点,终于搭出了这个框架并成功运行(其实就是一直运行不出来). 为了这八个小时的奋战,我都得记录这个艰难的 ...

  8. SSM项目初始化配置示例

    SSM项目初始化配置示例 1.Spring配置 //配置类说明 @Configuration //基于aspectj的AOP支持 @EnableAspectJAutoProxy //事务支持 @Ena ...

  9. SSM纯注解后台代码整合(Spring+SpringMvc+Mybatis)

    SSM后台整合(Spring+SpringMvc+Mybtis+事务+Rest风格+统一结果封装+统一异常处理+拦截器) 文章目录 1 基础环境搭建 1.1 建表 1.2 创建web项目 1.3 导入 ...

  10. SSM整合的配置+功能模块+测试

    SSM整合的配置+功能模块+测试 一. 配置准备 1.1 module结构 1.2 pom.xml 1.3 resources 1.3.1 jdbc.properties: 1.4 config 1. ...

最新文章

  1. 2w字 + 40张图带你参透并发编程!
  2. 使用PaupGUI软件合并一致性树consensus tree
  3. 思考:通过MMU/TLB/Cache对安全内存攻击的可能性
  4. Chrome扩展程序——TabCopy:一键复制网页标题和网址
  5. 光流 | 稠密光流估计(基于LK光流)(源代码分享)
  6. nopCommerce的源代码结构和架构
  7. 银行招聘网计算机类笔试,中国人民银行计算机类笔试模拟题
  8. laravel-神奇的服务容器(转)
  9. 苏宁启动30周年庆:联合近300个品牌启动“超级品牌季”
  10. 随想录(用好自己的时间)
  11. 在python中、如果异常并未被处理或捕捉_Python异常处理总结
  12. C语言中整型常量的表达方式
  13. 怎样让计算机默认记事本格式,电脑记事本怎么改格式
  14. 从零到一,美芽的技术实战
  15. 【Traffmonetizer】利用闲置电脑/VPS/安卓手机/树莓派来挂机
  16. F - Shifting String(置换的阶+思维)
  17. 小米是最能赚外国人钱的国产手机品牌,其他手机品牌只能窝里横
  18. STM32F0 、F1 在软件程序中写读保护选项字节(Option Bytes)
  19. java webservice应用总结
  20. 目前智能手机 微型计算机,微型计算机基础知识1(新).ppt.ppt

热门文章

  1. 【论文阅读】FFUNet:一种新的特征融合为医学图像分割提供了强大的解码器
  2. 在线直播系统搭建的功能包含哪些?
  3. 从5点来分析搜索引擎算法
  4. Co-occurrence网络图绘制教程(附详细代码)
  5. 单片机蓝桥杯之LED点亮(国信CT107D开发板)
  6. 黑马前端基础-HTML-SE
  7. unity创建草地_Unity3D学习笔记(三)为地形添加花草树木
  8. 计算机专业毕业论文审查意见,计算机专业毕业论文评语
  9. 同一局域网入侵_局域网IP地址冲突、环路?千兆接入交换机选型很重要
  10. Linux多启动U盘,syslinux 制作多系统启动U盘