SpringBoot + Mybatis integra múltiples bases de datos (mysql + oracle)

En trabajos recientes, el proyecto necesita cambiar de base de datos. Sin embargo, debido a la gran cantidad de datos y las frecuentes actualizaciones de datos, se planea usar bases de datos duales (mysql + oracle) para garantizar el funcionamiento normal del proyecto. comparta cómo el proyecto Springboot integra mysql + oracle

1. Preparación del entorno

Introducir dependencias de la base de datos (puede elegir una versión dependiente según la versión de la base de datos)

<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>

La integración de bases de datos duales requiere la configuración manual de la fuente de datos, por lo que es necesario cancelar la configuración automática de la fuente de datos en la clase de inicio

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

La ruta de escaneo automático del archivo xml de configuración de Mybatis ya no es necesaria y se cambia a la configuración manual de la ruta xml

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

2. Configurar manualmente el origen de datos

información de la base de datos de configuración 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

Configuración de fuente de datos mysql

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);
    }

}

Colocación de la fuente de datos de Oracle

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);
    }
}

Dado que mysql y oracle se configuran por separado, es necesario separar su xml y dao, como se muestra en la siguiente figura:
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
Este es el final, bienvenido a dejar un mensaje

Supongo que te gusta

Origin blog.csdn.net/weixin_44947701/article/details/124133441
Recomendado
Clasificación