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.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.secondary")
//MapperScan 明示的にセカンダリsqlSessionTemplatを宣言しないといけません
@MapperScan(basePackages = "jp.dip.arimodoki.mapper.secondary",
                sqlSessionTemplateRef = "secondarySqlSessionTemplate")
@Data       //lombok プロパティにSetter/Getterが必要
public class MybatisSecondaryConfig 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 secondaryDataSource  = null;

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

    /**
     * セカンダリ トランザクションマネージャー
     * @return DataSourceTransactionManagerを返す
     */
    @Bean(name = "secondaryTransactionManager")
    public DataSourceTransactionManager transactionManager() {

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

        return transactionManager;
    }

    /**
     * セカンダリな MyBatis SqlSessionTemplate 生成
     * @return 生成したSqlSessionTemplate を返す
     * @throws Exception
     */
    @Bean(name = "secondarySqlSessionTemplate")
    public SqlSessionTemplate sqlSessionTemplate() throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        //Datasourceをセットします
        bean.setDataSource(this.secondaryGetDataSource());

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