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類型連接數據庫的.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM