zoukankan      html  css  js  c++  java
  • springboot2连接多数据库mysql+oracle

    使用下面两种类型数据库:

    1. mysql的版本5.5.28 (select @@version), user是其中的一张表格

    2. oracle的版本11.2.0.1.0(select * from v$version), userinfo是其中的一张表格

    使用IntelliJ IDEAL建立springboot项目, springboot的版本是 2.2.6.RELEASE.

    pom.xml文件内容如下:

    要加入以下内容, 这样才能连接Mysql和Oracle数据库

    <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    <dependency>
           <groupId>com.oracle</groupId>
           <artifactId>ojdbc6</artifactId>
           <version>11.2.0.3</version>
    </dependency>

    application.yml内容如下:

    server:
      port: 8082
    spring:
      profiles:
        active: dev

    application-dev.yml内容如下:

    spring:
      datasource:
        primary: #mysql database config
          driverClassName: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://localhost:3306/testMysql?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
          username: mysqlUsername
          password: mysqlPassword
        secondary: #oracle database config
          driverClassName: oracle.jdbc.OracleDriver
          url: jdbc:oracle:thin:@localhost:1521:testOracle
          username: oracleUsername
          password: oraclePassword
    mybatis:
    mapper-locations: classpath:mapper/mysql/*.xml, classpath:mapper/oracle/*.xml
    config-location: classpath:config/mybatis/mybatis_config.xml
    type-aliases-package: com.test.demo.pojo.mysql, com.test.demo.pojo.oracle

    DataSourceConfig.java 这是数据库配置的共同文件,其实就是抽取共性的操作而已.

    package com.test.demo.config;
    
    import com.test.demo.utils.CommonVariable;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.mybatis.spring.SqlSessionFactoryBean;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
    
    import javax.sql.DataSource;
    
    public class DataSourceConfig {
    
        private static final Logger LOG = LoggerFactory.getLogger(DataSourceConfig.class);
    

       /*
        * 这里主要加载对应数据库的mapper.xml和对应的pojo文件.
        * 因为要加载两种数据库, 所以配置只能通过java代码来动态配置.
        */    
        public SqlSessionFactory sqlSessionFactory(DataSource dataSource, String dataBaseType) throws Exception {
            LOG.info("dataBaseType:" + dataBaseType);
            SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
            PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
            factoryBean.setDataSource(dataSource);
            if (CommonVariable.MYSQL.equalsIgnoreCase(dataBaseType)) {
                factoryBean.setMapperLocations(resolver.getResources("classpath:mapper/mysql/*.xml")); //这里加载Mysql下面的xml文件
                factoryBean.setTypeAliasesPackage("com.test.demo.pojo.mysql"); //这里加载Mysql下面的对应的pojo
            } else if (CommonVariable.ORACLE.equalsIgnoreCase(dataBaseType)) {
                factoryBean.setMapperLocations(resolver.getResources("classpath:mapper/oracle/*.xml")); //这里加载Oracle下面的xml
                factoryBean.setTypeAliasesPackage("com.xum.demo.pojo.oracle"); //这里加载Oracle下面对应的pojo
            }
            factoryBean.setConfigLocation(resolver.getResource("classpath:config/mybatis/mybatis_config.xml")); //这里加载共同的config
            return factoryBean.getObject();
        }
    
    }

    MySqlDataSourceConfig.java,  这是mysql的配置, 加@Primary是首先的配置数据库

    package com.test.demo.config;
    
    import com.alibaba.druid.pool.DruidDataSource;
    import com.test.demo.utils.CommonVariable;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.mybatis.spring.SqlSessionTemplate;
    import org.mybatis.spring.annotation.MapperScan;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.Primary;
    import org.springframework.jdbc.datasource.DataSourceTransactionManager;
    
    import javax.sql.DataSource;
    
    @Configuration
    @MapperScan(basePackages = "com.test.demo.dao.mysql", sqlSessionFactoryRef = "mysqlSqlSessionFactory")
    public class MySqlDataSourceConfig extends DataSourceConfig {
    
        private static final Logger LOG = LoggerFactory.getLogger(MySqlDataSourceConfig.class);
    
        @Value("${spring.datasource.primary.url}")
        private String url;
        @Value("${spring.datasource.primary.driverClassName}")
        private String driverClassName;
        @Value("${spring.datasource.primary.username}")
        private String username;
        @Value("${spring.datasource.primary.password}")
        private String password;
    
        @Primary
        @Bean(name = "mysqlDataSource")
        public DataSource mysqlDataSource() {
            DruidDataSource druidDataSource = new DruidDataSource();
            druidDataSource.setDriverClassName(driverClassName);
            druidDataSource.setUrl(url);
            druidDataSource.setUsername(username);
            druidDataSource.setPassword(password);
            return druidDataSource;
        }
    
        @Primary
        @Bean(name = "mysqlTransactionManager")
        public DataSourceTransactionManager mysqlTransactionManager(
                @Qualifier(value = "mysqlDataSource") DataSource dataSource) {
            DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager(dataSource);
            return dataSourceTransactionManager;
        }
    
        @Primary
        @Bean(name = "mysqlSqlSessionFactory")
        public SqlSessionFactory sqlSessionFactory(
                @Qualifier(value = "mysqlDataSource") DataSource dataSource) throws Exception {
            SqlSessionFactory factoryBean = super.sqlSessionFactory(dataSource, CommonVariable.MYSQL);
            return factoryBean;
        }
    
        @Primary
        @Bean(name = "mysqlSqlSessionTemplate")
        public SqlSessionTemplate testSqlSessionTemplate(
                @Qualifier(value = "mysqlSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
            return new SqlSessionTemplate(sqlSessionFactory);
        }
    
    }

    OracleDataSourceConfig.java,  这是oracle的配置

    package com.test.demo.config;
    
    import com.alibaba.druid.pool.DruidDataSource;
    import com.test.demo.utils.CommonVariable;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.mybatis.spring.SqlSessionTemplate;
    import org.mybatis.spring.annotation.MapperScan;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.jdbc.datasource.DataSourceTransactionManager;
    
    import javax.sql.DataSource;
    
    @Configuration
    @MapperScan(basePackages = "com.xum.demo.dao.oracle", sqlSessionFactoryRef = "oracleSqlSessionFactory")
    public class OracleDataSourceConfig extends DataSourceConfig {
    
        private static final Logger LOG = LoggerFactory.getLogger(OracleDataSourceConfig.class);
    
        @Value("${spring.datasource.secondary.url}")
        private String url;
        @Value("${spring.datasource.secondary.driverClassName}")
        private String driverClassName;
        @Value("${spring.datasource.secondary.username}")
        private String username;
        @Value("${spring.datasource.secondary.password}")
        private String password;
    
        @Bean(name = "oracleDataSource")
        public DataSource oracleDataSource() {
            DruidDataSource dataSource = new DruidDataSource();
            dataSource.setDriverClassName(driverClassName);
            dataSource.setUrl(url);
            dataSource.setUsername(username);
            dataSource.setPassword(password);
            return dataSource;
        }
    
        @Bean(name = "oracleTransactionManager")
        public DataSourceTransactionManager oracleTransactionManager(
                @Qualifier(value = "oracleDataSource") DataSource dataSource) {
            DataSourceTransactionManager manager = new DataSourceTransactionManager(dataSource);
            return manager;
        }
    
        @Bean(name = "oracleSqlSessionFactory")
        public SqlSessionFactory sqlSessionFactory(
                @Qualifier(value = "oracleDataSource") DataSource dataSource) throws Exception {
            SqlSessionFactory factoryBean = super.sqlSessionFactory(dataSource, CommonVariable.ORACLE);
            return factoryBean;
        }
    
        @Bean(name = "oracleSqlSessionTemplate")
        public SqlSessionTemplate testSqlSessionTemplate(
                @Qualifier(value = "oracleSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
            return new SqlSessionTemplate(sqlSessionFactory);
        }
    
    }

    CommonVariable.java内容, 这里只是常量文件class

    package com.test.demo.utils;
    
    public class CommonVariable {
        
        public final static String MYSQL = "mysql";
        public final static String ORACLE = "oracle";
        
    }

    随便写一个controller来测试:

    @Controller
    @RequestMapping("/index")
    public class UserController {
    
        private static final Logger LOG = LoggerFactory.getLogger(UserController.class);
        private static final int successStatus = 200;
        private static final int failedStatus = 100;
    
        @Autowired
        private UserService userService;
    
        @Autowired
        private UserinfoService userinfoService;
    
        @RequestMapping(value="/updateUserByMysql", method = {RequestMethod.POST, RequestMethod.PUT})
        @ResponseBody
        public String updateUser(@RequestBody(required=true) User user) {
            String status = "{"status" : "" + successStatus + ""}";
            int affectRow = this.userService.updateByPrimaryKeySelective(user);
            if (-1 == affectRow) {
                status = "{"status" : "" + failedStatus + ""}";
            }
            return status;
        }
        
        @RequestMapping(value="/updateUserinfoByOracle", method = {RequestMethod.POST, RequestMethod.PUT})
        @ResponseBody
        public String updateUserinfo(@RequestBody(required=true) Userinfo userinfo) {
            String status = "{"status" : "" + successStatus + ""}";
            int affectRow = this.userinfoService.updateByPrimaryKeySelective(userinfo);
            if (-1 == affectRow) {
                status = "{"status" : "" + failedStatus + ""}";
            }
            return status;
        }
    
    }

    当执行http://localhost:8082/index/updateUserByMysqlhttp://localhost:8082/index/updateUserinfoByOracle

    都可以成功.

    个人感觉, SpringBoot在连接数据库的时候,是先根据Primary的这个注解来先执行的,

    如果没有合适的话, 它会使用secondary类型连接数据库的.

  • 相关阅读:
    动态规划
    nginx访问静态资源403
    转)服务器CPU占用100%的问题排查
    linux下脚本设置开机自启服务
    在蓝鲸标准运维上进行原子开发
    Django model数据排序
    Mac tar压缩命令,去除隐藏文件
    vue 简单的分页功能实现二
    vue 简单的分页功能实现一
    安装 libmagic in Mac OS (for Python-magic)
  • 原文地址:https://www.cnblogs.com/xumBlog/p/12727923.html
Copyright © 2011-2022 走看看