JavaのWebアプリケーション開発フレームワークによる、Webサイト開発の顛末記です。

EclipseのMavenを使った、Spring-MVC、Thymeleaf、MyBatis 等のプログラミングテクニックを、
備忘録的に記録しています。実際に動くソースコードを多用して説明していますので、
これからEclipseや、Spring-MVCを始めたいと思っている人にとって、少しでも参考になれば幸いです。
Spring-MVCの散歩道 > 応用の森(Spring Boot編) > 複数のDB(データソース)に接続する

package jp.dip.arimodoki.config;

import javax.sql.DataSource;

import org.apache.tomcat.dbcp.dbcp2.BasicDataSource;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Primary;
import org.springframework.context.annotation.Scope;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternUtils;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import jp.dip.arimodoki.common.CConst;
import lombok.Data;

/**
 * 複数DB接続用
 * プライマリな Mybatis設定クラス
 * Datasourceを生成して、SqlSessionTemplateを初期化する処理を行います。
 */
@Configuration
//application.ymlからプライマリDB接続情報をクラス変数に取得する
@ConfigurationProperties(prefix = "spring.mybatis.primary")
//MapperScan 優先的にプライマリsqlSessionTemplatが使用されます
@MapperScan(basePackages = "jp.dip.arimodoki.mapper.primary")
@Data       //lombok プロパティにSetter/Getterが必要
public class MybatisPrimaryConfig implements CConst {
    /** JDBC接続情報 */
    private String driverClassName;

    private String jdbcUrl;

    private String jdbcUsername;

    private String jdbcPassword;

    private int maxIdle;

    private int minIdle;

    private int initialSize;

    private boolean defaultAutoCommit;

    /** Mybatis 環境設定 */
    private String configfile;

    private String mapperlocation;

    private String typealiases;

    /**
    * 唯一のBasicDataSourceインスタンス
    */
    private static BasicDataSource primaryDataSource  = null;

    /**
     * Tomcat dbcp BasicDataSource を生成する
     * @return 生成したプライマリDataSourceのインスタンスを返す
     */
    @Primary
    @Bean
     public DataSource primaryGetDataSource() {
        if(primaryDataSource == null) {
            primaryDataSource = new BasicDataSource();
            primaryDataSource.setDriverClassName(this.driverClassName);
            primaryDataSource.setUrl(this.jdbcUrl);
            primaryDataSource.setUsername(this.jdbcUsername);
            primaryDataSource.setPassword(this.jdbcPassword);
            primaryDataSource.setMaxIdle(this.maxIdle);
            primaryDataSource.setMinIdle(this.minIdle);
            primaryDataSource.setInitialSize(this.initialSize);
            primaryDataSource.setDefaultAutoCommit(this.defaultAutoCommit);
        }
        return primaryDataSource;
    }

    /**
     * プライマリ トランザクションマネージャー
     * @return DataSourceTransactionManagerを返す
     */
    @Primary
    @Bean(name = "primaryTransactionManager")
    public DataSourceTransactionManager transactionManager() {

        DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
        //Datasourceをセットします
        transactionManager.setDataSource(this.primaryGetDataSource());

        return transactionManager;
    }

    /**
     * プライマリな MyBatis SqlSessionTemplate 生成
     * @return 生成したSqlSessionTemplate を返す
     * @throws Exception
     */
    @Primary
    @Bean(name = "primarySqlSessionTemplate")
    public SqlSessionTemplate sqlSessionTemplate() throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        //Datasourceをセットします
        bean.setDataSource(this.primaryGetDataSource());

        ResourcePatternResolver resolver =
                    ResourcePatternUtils.getResourcePatternResolver(new DefaultResourceLoader());

        // MyBatis のコンフィグレーションファイル(無くても動くよ)
        bean.setConfigLocation(resolver.getResource(this.configfile));
        // MyBatis で使用する SQLマッパー XMLファイル群(defaultは、resources配下のパッケージ階層と同じ場所)
        bean.setMapperLocations(resolver.getResources(this.mapperlocation));
        //DTOパッケージ指定(XMLに長ったらしいDTOのパッケージ名を書かなくて良い)
        bean.setTypeAliasesPackage(this.typealiases);

        return new SqlSessionTemplate(bean.getObject());
    }
}