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. データソースを手動で構成する

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 データソースの構成

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