SpringBoot + Mybatis集成多种数据库(mysql + oracle)

最近工作中,项目需要切换数据库,但是由于原来数据量比较大,且数据更新频繁,所以计划先采用双数据库(mysql + oracle)的方式保证项目正常运行,今天就分享一下Springboot项目如何集成 mysql + oracle

1. 环境准备

引入数据库依赖(可以根据数据库版本选择依赖版本)

<dependencies>
		<!-- jdbc驱动 -->
		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <!-- mybatis启动器 -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.0</version>
        </dependency>
        <!-- mysql驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.32</version>
            <scope>runtime</scope>
        </dependency>
        <!--数据库连接池-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.13</version>
        </dependency>
        <!-- oracle驱动 -->
       	<dependency>
		    <groupId>com.oracle</groupId>
		    <artifactId>ojdbc6</artifactId>
		    <version>11.2.0.4.0</version>
		</dependency>
    </dependencies>

集成双数据库需要手动去配置数据源,因此需要在启动类上把数据源的自动配置取消

@SpringBootApplication(exclude = {
    
    DataSourceAutoConfiguration.class})
public class XxxApplication {
    
    
    public static void main(String[] args) {
    
    
        SpringApplication.run(XxxApplication.class);
    }
}

Mybatis配置xml文件自动扫描路径也不需要了,转为手动配置xml路径

# 这些不需要了
mybatis:
  configuration:
    default-statement-timeout: 30
    map-underscore-to-camel-case: true
  mapper-locations: classpath:/mapper/*.xml

2. 手动配置DataSource

application.yml配置数据库信息

spring:
  datasource:
    mysql:
      driver-class-name: com.mysql.jdbc.Driver
      # mysql数据库url和账号密码
      url: jdbc:mysql://localhost:3306/heima?serverTimezone=GMT%2B8&allowMultiQueries=true
      username: root
      password: root
    oracle:
      driver-class-name: oracle.jdbc.driver.OracleDriver
      # oracle数据库url和账号密码
      url: jdbc:oracle:thin:@localhost:1521:test
      username: root
      password: root

mysql DataSource配置

import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
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.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;

@Configuration
// basePackages为mysql dao文件的路径,sqlSessionFactoryRef指定SqlSession工厂bean
@MapperScan(basePackages = "xxx.dao.mysql", sqlSessionFactoryRef = "mysqlSqlSessionFactory")
public class MysqlDataSourceConfig {
    
    
    @Value("${spring.datasource.mysql.url}")
    private String url;
 
    @Value("${spring.datasource.mysql.username}")
    private String user;
 
    @Value("${spring.datasource.mysql.password}")
    private String password;
 
    @Value("${spring.datasource.mysql.driver-class-name}")
    private String driverClass;

    //对应mysql的mapper.xml文件路径
    private static final String MAPPER_LOCATION = "classpath:mapper/mysql/*.xml";

    /**
     * 配置mysql DataSource
     */
    @Bean(name = "mysqlDataSource")
    public DataSource mysqlDataSource() {
    
    
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driverClass);
        dataSource.setUrl(url);
        dataSource.setUsername(user);
        dataSource.setPassword(password);
        return dataSource;
    }

    /**
     * 配置事务管理器
     */
    @Bean(name = "mysqlTransactionManager")
    public DataSourceTransactionManager mysqlTransactionManager() {
    
    
        return new DataSourceTransactionManager(mysqlDataSource());
    }

    /**
     * 配置SqlSession工厂
     */
    @Bean(name = "mysqlSqlSessionFactory")
    public SqlSessionFactory mysqlSqlSessionFactory(@Qualifier("mysqlDataSource") DataSource mysqlDataSource)
            throws Exception {
    
    
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(mysqlDataSource);
        sessionFactory.setMapperLocations(
                new PathMatchingResourcePatternResolver().getResources(MysqlDataSourceConfig.MAPPER_LOCATION));
        return sessionFactory.getObject();
    }

    /**
     * 配置SqlSessionTemplate
     */
    @Bean(name = "mysqlSqlSessionTemplate")
    public SqlSessionTemplate mysqlSqlSessionTemplate(@Qualifier("mysqlSqlSessionFactory") SqlSessionFactory sqlSessionFactory)
            throws Exception {
    
    
        return new SqlSessionTemplate(sqlSessionFactory);
    }

}

oracle DataSource配置

import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
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.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;

@Configuration
// basePackages为oracle dao文件的路径,sqlSessionFactoryRef指定SqlSession工厂bean
@MapperScan(basePackages = "xxx.dao.oracle", sqlSessionFactoryRef = "oracleSqlSessionFactory")
public class OracleDataSourceConfig {
    
    
    @Value("${spring.datasource.oracle.url}")
    private String url;
 
    @Value("${spring.datasource.oracle.username}")
    private String user;
 
    @Value("${spring.datasource.oracle.password}")
    private String password;
 
    @Value("${spring.datasource.oracle.driver-class-name}")
    private String driverClass;

    //对应oracle的mapper.xml文件路径
    private static final String MAPPER_LOCATION = "classpath:mapper/oracle/*.xml";

    /**
     * 配置oracle DataSource
     */
    @Bean(name = "oracleDataSource")
    public DataSource oracleDataSource() {
    
    
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driverClass);
        dataSource.setUrl(url);
        dataSource.setUsername(user);
        dataSource.setPassword(password);
        return dataSource;
    }

    /**
     * 配置事务管理器
     */
    @Bean(name = "oracleTransactionManager")
    public DataSourceTransactionManager oracleTransactionManager() {
    
    
        return new DataSourceTransactionManager(oracleDataSource());
    }

    /**
     * 配置SqlSession工厂
     */
    @Bean(name = "oracleSqlSessionFactory")
    public SqlSessionFactory oracleSqlSessionFactory(@Qualifier("oracleDataSource") DataSource oracleDataSource)
            throws Exception {
    
    
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(oracleDataSource);
        sessionFactory.setMapperLocations(
                new PathMatchingResourcePatternResolver().getResources(OracleDataSourceConfig.MAPPER_LOCATION));
        return sessionFactory.getObject();
    }

    /**
     * 配置SqlSessionTemplate
     */
    @Bean(name = "oracleSqlSessionTemplate")
    public SqlSessionTemplate oracleSqlSessionTemplate(@Qualifier("oracleSqlSessionFactory") SqlSessionFactory sqlSessionFactory)
            throws Exception {
    
    
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

由于mysql和oracle是分开配置的,因此需要把他们xml以及dao剥离开,如下图:
在这里插入图片描述
在这里插入图片描述
到此结束了,欢迎留言

猜你喜欢

转载自blog.csdn.net/weixin_44947701/article/details/124133441
今日推荐