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
@ConfigurationProperties(prefix = "spring.mybatis.primary")
@MapperScan(basePackages = "jp.dip.arimodoki.mapper.primary")
@Data
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();
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();
bean.setDataSource(this.primaryGetDataSource());
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());
}
}
|