公司要求,需要使用两个数据库,一个mysql,一个oracle。所以需要配置两个数据库来进行操作。

1.首先,需要在jdbc.properties文件中将两个库的配置数据写入,不过一个写driver,另一个写driver2,区别两个库的变量名。

代码如下:

#oracle web
jdbc.driver=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@192.168.3.4:1521:ORCL
jdbc.username=abc
jdbc.password=adasdsa
#mysql
jdbc.driver2=com.mysql.jdbc.Driver
jdbc.url2=jdbc:mysql://192.168.3.4:3306/logcount?useUnicode=true&characterEncoding=utf-8
jdbc.username2=root
jdbc.password2=1234565

2.在spring-mybatis.xml中的配置:

先开启注解模式
    两个数据库分别配置不同id的DataSource
    就是配置切换数据库的自定义类的路径,选中默认数据库。
    配置aop拦截dao层的所有访问接口,在dao层注解更改数据库。

<?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:tx="http://www.springframework.org/schema/tx"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xsi:schemaLocation="
              http://www.springframework.org/schema/beans
              http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
              http://www.springframework.org/schema/mvc
              http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd
              http://www.springframework.org/schema/context
              http://www.springframework.org/schema/context/spring-context-4.2.xsd
              http://www.springframework.org/schema/aop
              http://www.springframework.org/schema/aop/spring-aop-4.1.xsd
              http://www.springframework.org/schema/tx
              http://www.springframework.org/schema/tx/spring-tx-4.1.xsd">
         <!-- 开启注解模式 -->
        <context:annotation-config />
        <context:component-scan base-package="com.shiyanlou" />
     
        <context:property-placeholder location="classpath:jdbc.properties" />
        <!-- oracle数据库 -->
        <bean id="dataSource_first"
            class="org.springframework.jdbc.datasource.DriverManagerDataSource">
            <property name="driverClassName" value="${jdbc.driver}" />
            <property name="url" value="${jdbc.url}" />
            <property name="username" value="${jdbc.username}" />
            <property name="password" value="${jdbc.password}" />
        </bean>
        <!-- sqlite数据库 -->
        <bean id="dateSource_second"
            class="org.springframework.jdbc.datasource.DriverManagerDataSource">
            <property name="driverClassName" value="${jdbc.driver2}" />
            <property name="url" value="${jdbc.url2}" />
            <property name="username" value="${jdbc.username2}" />
            <property name="password" value="${jdbc.password2}" />
        </bean>
        <!-- 下面的是切换数据库的自定义类 -->
        <bean id="dataSource" class="com.shiyanlou.util.MultipleDataSource">
        <!-- 默认使用sqlite数据库 -->
            <property name="defaultTargetDataSource" ref="dateSource_second"></property>
            <property name="targetDataSources">
                <map>
                    <entry key="dataSource_first" value-ref="dataSource_first"></entry>
                    <entry key="dateSource_second" value-ref="dateSource_second"></entry>
                </map>
            </property>
        </bean>
        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
            <property name="dataSource" ref="dataSource"></property>
            <property name="mapperLocations" value="classpath:/mappers/*.xml"></property>
            <property name="configLocation" value="classpath:mybatis-config.xml" />
        </bean>
     
        <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"
            p:basePackage="com.shiyanlou.dao" p:sqlSessionFactoryBeanName="sqlSessionFactory">
     
        </bean>
     
        <bean id="txManager"
            class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="dataSource"></property>
        </bean>
     
        <tx:annotation-driven transaction-manager="txManager" />
        <!-- 切面 -->
        <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
        <bean id="dataSourceAspect" class="com.shiyanlou.util.DataSourceAspect"></bean>
            <aop:config>
                <aop:aspect ref="dataSourceAspect">
                    <!-- 拦截所有service方法,在dao层添加注解 -->
                    <aop:pointcut expression="execution(* com.shiyanlou.dao..*.*(..))" id="dataSourcePointcut"/>
                    <aop:before method="intercept" pointcut-ref="dataSourcePointcut"/>
                </aop:aspect>
            </aop:config>
    </beans>

3.工具类的配置:自定义注解

注解类DataSource.java

/**
     * <p>Title: DataSource.java</p>   
     * <p>Description: </p>  
     * <p>Copyright: Copyright (c) 2018</p>   
     * @author 林猛
     * @date 2018年5月3日  
     * @version 1.0   
    */  
    package com.shiyanlou.util;
     
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
     
    /**
     * @author linmeng
     *
     */
     
    /*    @Retention(RetentionPolicy.RUNTIME)
        @Target(ElementType.METHOD)*/
        @Target({ElementType.TYPE,ElementType.METHOD})
        @Retention(RetentionPolicy.RUNTIME)
        public @interface DataSource{
            String value();
        }

注解类DataSourceAspect.java

/**
     * <p>Title: DataSourceAspect.java</p>   
     * <p>Description: </p>  
     * <p>Copyright: Copyright (c) 2018</p>   
     * @author 林猛
     * @date 2018年5月3日  
     * @version 1.0   
    */  
    package com.shiyanlou.util;
     
    import java.lang.reflect.Method;
     
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.reflect.MethodSignature;
     
    /**
     * @author linmeng
     *
     */
    public class DataSourceAspect{
    //    拦截目标方法,获取由@DataSource指定的数据源标识,设置到线程存储中以便切换数据源
        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());
        }
        /**
         * 提取目标对象方法注解和类型注解中的数据源标识
         */
        
        public void resolveDataSource(Class<?>clazz,Method method) {
            try {
                Class<?>[]types=method.getParameterTypes();
    //            默认使用类型注解
                if (clazz.isAnnotationPresent(DataSource.class)) {
                    DataSource source = clazz.getAnnotation(DataSource.class);
                    DbContextHolder.setDataSource(source.value());
                }
    //            方法注解可以覆盖类型注解
                Method m=clazz.getMethod(method.getName(), types);
                if (m!=null && m.isAnnotationPresent(DataSource.class)) {
                    DataSource source = m.getAnnotation(DataSource.class);
                    DbContextHolder.setDataSource(source.value());
                }
            } catch (Exception e) {
                System.out.println(clazz+":"+e.getMessage());
            }
        }
    }

切换数据库的工具类DbContextHolder.java:

/**
     * <p>Title: DbContextHolder.java</p>   
     * <p>Description: </p>  
     * <p>Copyright: Copyright (c) 2018</p>   
     * @author 林猛
     * @date 2018年5月2日  
     * @version 1.0   
    */  
    package com.shiyanlou.util;
     
    /**
     * @author linmeng
     * 切换数据源的工具类
     */
    public class DbContextHolder {
        private static final ThreadLocal<String>THREAD_DATA_SOURCE =new ThreadLocal<>();
        /**
         * 设置当前数据库
         */
         public static void setDataSource(String dataSource) {
                THREAD_DATA_SOURCE.set(dataSource);
            }
        /**
         * 取得当前数据库
         */
           public static String getDataSource() {
                return THREAD_DATA_SOURCE.get();
            }
     
        /**
         * 清除上下文数据
         */
           public static void clearDataSource() {
                THREAD_DATA_SOURCE.remove();
            }
    }

到此为止,数据库配置就完全完成了,使用的时候非常方便,如果配置的是两个数据库的话,有一个默认数据库,不需要任何修改,而需要使用另一个数据库的时候,只需要在dao层添加一个注解:

/**
     * <p>Title: CityDao.java</p>   
     * <p>Description: </p>  
     * <p>Copyright: Copyright (c) 2018</p>   
     * @author 林猛
     * @date 2018年5月4日  
     * @version 1.0   
    */  
    package com.shiyanlou.dao;
     
    import java.util.List;
    import java.util.Map;
     
    import org.apache.ibatis.annotations.Param;
     
    import com.shiyanlou.domain.CityInfo;
    import com.shiyanlou.util.DataSource;
     
    /**
     * @author linmeng
     *    
     */
    @DataSource(value="dataSource_first")
    public interface CityDao {
        
        public List<CityInfo>getAdInfo(@Param("city")String city);
        public Integer getAdInfoCount(String city);
        public List<CityInfo>getCityInfo(Map<String, Object>map);
        public List<CityInfo>getPoiData(Map<String, Object>map);
        public Integer getCityInfoCount(Map<String, Object>map);
        public List<CityInfo>singleCityExport(@Param("city")String city);
    }

这个注解是跟spring-mybatis.xml中配置的targetDataSources中的entry key  value有关系。

这里面好多具体配置我也不是特别懂,但是这样配置是可以使用的。大家可以试一下。
---------------------
作者:不会code的coder
来源:CSDN
原文:https://blog.csdn.net/qq_36746327/article/details/81033404
版权声明:本文为博主原创文章,转载请附上博文链接!

ssm多数据源的操作的更多相关文章

  1. hibernate与ssm多数据源配置

    hibernate: 1.配置多个数据源,比如2个:hibernate.cfg1.xml~hibernate.cfg8.xml <?xml version='1.0' encoding='UTF ...

  2. mysql之整合ssm多数据源配置

    一,基于SSM框架的多数据源配置 1.创建DynamicDataSourceHolder用于持有当前线程中使用的数据源标识 public class DynamicDataSourceHolder { ...

  3. springmvc SSM 多数据源 shiro redis 后台框架 整合

    A集成代码生成器 [正反双向(单表.主表.明细表.树形表,开发利器)+快速构建表单 下载地址    ; freemaker模版技术 ,0个代码不用写,生成完整的一个模块,带页面.建表sql脚本,处理类 ...

  4. C# 中DataGridView 绑定List<T>做数据源的操作问题

    若想将 List<T>作为DataGridView的数据源,然后后续还想继续操作的话,需要将List<T>赋值给BindingList对象, 然后直接将BindingList赋 ...

  5. datagridview的数据源的操作

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  6. 20. Spring Boot 默认、自定义数据源 、配置多个数据源 jdbcTemplate操作DB

    Spring-Boot-2.0.0-M1版本将默认的数据库连接池从tomcat jdbc pool改为了hikari,这里主要研究下hikari的默认配置 0.  创建Spring Boot项目,选中 ...

  7. ssm 项目记录用户操作日志和异常日志

    借助网上参考的内容,写出自己记录操作日志的心得!! 我用的是ssm项目使用aop记录日志:这里用到了aop的切点 和 自定义注解方式: 1.建好数据表: 数据库记录的字段有: 日志id .操作人.操作 ...

  8. ssm多数据源配置

    1.在.properties配置文件中 添加第二个数据源信息(type2,driver2, url2,username2,pawwword2) 2.修改spring-context.xml(src/m ...

  9. SSM + MySQL批量删除操作

    最近项目中有个购物车功能需要能够选中商品,然后批量删除的操作,也可以单个删除,其实代码很简单就能实现. 这里需要注意的就是你前端是怎么传值的,我这里采用的数组的形式,用 ‘,’隔开. 然后控制层代码如 ...

随机推荐

  1. Example of assigning attributes directly to an object name

    Student类 package com.itheima_05; /* * 学生类 * * 通过对象直接访问成员变量,会存在数据安全问题 * 这个时候,我们就想能不能不让外界的对象直接访问成员变量呢? ...

  2. 使用@Value进行静态常量的值注入

    @Component public class ExpressConstant { public static String URL; @Value("${express.url}" ...

  3. win10_64位系统下安装ALM12.01(QC),笔者只在Win10平台上试过,大家也可以在win7的平台上试一下,一个道理!(Alpha)

    HP的ALM是一个非常全面的缺陷管理系统,但安装学习的非常的麻烦,以前学的是ALM,好久没用带今天想学习一下发现安装的非常的困难 !发现网上对ALM的系统安装的介绍非常少,也非常琐碎!今天就借着自己学 ...

  4. Win10 Docker修改镜像存储位置

    发生现象: 在windows10下安装docker for windows,随着用docker pull image文件后,C盘的容量越来越小了,你可能也有一种跟我一样的想法,想改变默认的安装路径,本 ...

  5. 如何让4年前的电脑装win10开机跑进15秒

    我是用我的电脑测试的.看看我电脑的配置 我的是windows10,机械硬盘. 在这里要说的是给电脑优化,让其开机更快.当然,因电脑配置而异,我的最快是11秒.标题可能有点夸张了,结果因电脑配置而异,高 ...

  6. 5 hbase-shell + hbase的java api

    本博文的主要内容有 .HBase的单机模式(1节点)安装 .HBase的单机模式(1节点)的启动 .HBase的伪分布模式(1节点)安装  .HBase的伪分布模式(1节点)的启动    .HBase ...

  7. java继承-静态绑定和动态绑定

    静态绑定和动态绑定: 静态:程序执行前方法已经被绑定,针对java简单可以理解为程序编译器已的绑定(静态绑定)java当中的方法是final.static.private构造方法都是前期绑定 动态:运 ...

  8. Jackson实现Object对象与Json字符串的互转

    在项目开发过程中,当客户端与服务器响应时,数据交互是必不可少的.然而通过Json实现数据交互成为我们开发中的一部分,进而Jackson为我们的Json转化提供了很好的机制.下面我将利用实例总结如何使用 ...

  9. 本地缓存和redis

    项目中的传统架构在服务启动时 读取数据库的大部分数据到本地内存,在看到redis的作用时发出疑问,到底有什么样的区别以及怎么选择呢,下面是别人的回答 使用本地缓存快还是使用redis缓存好? Redi ...

  10. Codeforces Round #440 (Div. 2)【A、B、C、E】

    Codeforces Round #440 (Div. 2) codeforces 870 A. Search for Pretty Integers(水题) 题意:给两个数组,求一个最小的数包含两个 ...