Spring BootとMybatis配置の多データソースについて詳しく説明します。


現在の業界の操作データベースのフレームワークは、一般的にMybatisですが、多くのビジネスシーンでは、1つのプロジェクトに複数のデータソースを配置して、業務ロジックを実現する必要があります。Spring Bootにおいても多データソースを実現し、Mybatisフレームに合わせてxmlファイルを作成してSQLを実行することができます。SpringBootでは多データソースの配置がとても便利で、
コードを開始します。
pom.xmlファイルにはいくつかの依存関係を追加する必要があります。

<!-- Spring Boot Mybatis    -->
<dependency>
 <groupId>org.mybatis.spring.boot</groupId>
 <artifactId>mybatis-spring-boot-starter</artifactId>
 <version>1.2.0</version>
</dependency>

<!-- MySQL        -->
<dependency>
 <groupId>mysql</groupId>
 <artifactId>mysql-connector-java</artifactId>
 <version>5.1.39</version>
</dependency>

<!-- Druid         -->
<dependency>
 <groupId>com.alibaba</groupId>
 <artifactId>druid</artifactId>
 <version>1.0.18</version>
</dependency>

appication.propertiesは2つのデータソースの構成を構成します。

# master      
master.datasource.url=jdbc:mysql://localhost:3306/springbootdb?useUnicode=true&characterEncoding=utf8
master.datasource.username=root
master.datasource.password=xieshuai6666
master.datasource.driverClassName=com.mysql.jdbc.Driver

# second      
second.datasource.url=jdbc:mysql://localhost:3306/springbootdb_second?useUnicode=true&characterEncoding=utf8
second.datasource.username=root
second.datasource.password=xieshuai6666
second.datasource.driverClassName=com.mysql.jdbc.Driver
データソースの設定
マルチソースの配置には、マスターデータソース、すなわちマスターData SourceConfigの配置が必要です。
  • @PrimaryマークこのBeanが複数の同類Bean候補の場合、このBeanが優先される。マルチソースの配置には、メインデータソースが必要です。@PrimaryでこのBean
  • をマークします。
  • @MapperScanはMapperインターフェースをスキャンし、容器管理を行います。パッケージパスはmasterまで正確です。次のclusterデータソースと正確に区別するために
  • @Valueはグローバルプロファイルaplication.propertiesのkv構成を取得し、自動組立sql Session FactoryRefはkeyを定義し、唯一のSql Session Factoryの例を表しています。
  • マスターData SourceConfigのコード:
    
    @Configuration
    //    Mapper        
    @MapperScan(basePackages = MasterDataSourceConfig.PACKAGE, sqlSessionFactoryRef = "masterSqlSessionFactory")
    public class MasterDataSourceConfig {
    
      //     master   ,          
      static final String PACKAGE = "org.spring.springboot.dao.master";
      static final String MAPPER_LOCATION = "classpath:mapper/master/*.xml";
    
      @Value("${master.datasource.url}")
      private String url;
    
      @Value("${master.datasource.username}")
      private String user;
    
      @Value("${master.datasource.password}")
      private String password;
    
      @Value("${master.datasource.driverClassName}")
      private String driverClass;
    
      @Bean(name = "masterDataSource")
      @Primary
      public DataSource masterDataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driverClass);
        dataSource.setUrl(url);
        dataSource.setUsername(user);
        dataSource.setPassword(password);
        return dataSource;
      }
    
      @Bean(name = "masterTransactionManager")
      @Primary
      public DataSourceTransactionManager masterTransactionManager() {
        return new DataSourceTransactionManager(masterDataSource());
      }
    
      @Bean(name = "masterSqlSessionFactory")
      @Primary
      public SqlSessionFactory masterSqlSessionFactory(@Qualifier("masterDataSource") DataSource masterDataSource)
          throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(masterDataSource);
        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
            .getResources(MasterDataSourceConfig.MAPPER_LOCATION));
        return sessionFactory.getObject();
      }
    }
    
    
    第二のデータソースSecondDataSourceConfigの構成は以下の通りである。
    
    @Configuration
    //    Mapper        
    @MapperScan(basePackages = ClusterDataSourceConfig.PACKAGE, sqlSessionFactoryRef = "clusterSqlSessionFactory")
    public class ClusterDataSourceConfig {
    
      //     cluster   ,          
      static final String PACKAGE = "org.spring.springboot.dao.cluster";
      static final String MAPPER_LOCATION = "classpath:mapper/cluster/*.xml";
    
      @Value("${cluster.datasource.url}")
      private String url;
    
      @Value("${cluster.datasource.username}")
      private String user;
    
      @Value("${cluster.datasource.password}")
      private String password;
    
      @Value("${cluster.datasource.driverClassName}")
      private String driverClass;
    
      @Bean(name = "clusterDataSource")
      public DataSource clusterDataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driverClass);
        dataSource.setUrl(url);
        dataSource.setUsername(user);
        dataSource.setPassword(password);
        return dataSource;
      }
    
      @Bean(name = "clusterTransactionManager")
      public DataSourceTransactionManager clusterTransactionManager() {
        return new DataSourceTransactionManager(clusterDataSource());
      }
    
      @Bean(name = "clusterSqlSessionFactory")
      public SqlSessionFactory clusterSqlSessionFactory(@Qualifier("clusterDataSource") DataSource clusterDataSource)
          throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(clusterDataSource);
        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
            .getResources(ClusterDataSourceConfig.MAPPER_LOCATION));
        return sessionFactory.getObject();
      }
    }
    
    
    これで、別のデータソースの配置が完了しました。残りはMybatisのxmlファイルとDAO層のインターフェースを作成し、Service層に注入して、そのまま使えばいいです。
    Service層のコード:
    
    @Service
    public class UserAndCityServiceImpl implements UserAndCityService{
    
      @Autowired
      private UserDao userDao;
      @Autowired
      private CityDao cityDao;
    
      @Override
      public UserVo getUser(String userName) {
        UserVo userVo = userDao.selectByUserName(userName);
        CityVo cityVo = cityDao.selectByCityName("   ");
        userVo.setDescription(cityVo.getCityName());
        return userVo;
      }
    }
    
    
    MybatisのxmlファイルUserDao.xmlとCityDao.xmlの内容は、いちいち展示しません。
    以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。