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
@ConfigurationProperties(prefix = "spring.mybatis.secondary")
@MapperScan(basePackages = "jp.dip.arimodoki.mapper.secondary",
sqlSessionTemplateRef = "secondarySqlSessionTemplate")
@Data
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();
transactionManager.setDataSource(this.secondaryGetDataSource());
return transactionManager;
}
/**
* セカンダリな MyBatis SqlSessionTemplate 生成
* @return 生成したSqlSessionTemplate を返す
* @throws Exception
*/
@Bean(name = "secondarySqlSessionTemplate")
public SqlSessionTemplate sqlSessionTemplate() throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(this.secondaryGetDataSource());
ResourcePatternResolver resolver =
ResourcePatternUtils.getResourcePatternResolver(new DefaultResourceLoader());
bean.setConfigLocation(resolver.getResource(this.configfile));
bean.setMapperLocations(resolver.getResources(this.mapperlocation));
bean.setTypeAliasesPackage(this.typealiases);
return new SqlSessionTemplate(bean.getObject());
}
}
|