一、屬性文件配置多數據源
#社區
spring.datasource.commonunity.driver-class-name=org.postgresql.Driver
spring.datasource.commonunity.url=jdbc:postgresql://**:5432/test_**
spring.datasource.commonunity.username=postgres
spring.datasource.commonunity.password=postgres
#flyway
spring.datasource.flyway.driver-class-name=org.postgresql.Driver
spring.datasource.flyway.url=jdbc:postgresql://**:5432/test_**
spring.datasource.flyway.username=postgres
spring.datasource.flyway.password=postgres
二、創建Datasource Bean
@Bean:是一個方法級別上的注解,主要用在@Configuration注解的類里,也可以用在@Component注解的類里。添加的bean的id為方法名
@Primary:指定在同一個接口有多個實現類可以注入的時候,默認選擇哪一個,而不是讓@Autowire注解報錯(一般用於多數據源的情況下)
@Qualifier:指定名稱的注入,當一個接口有多個實現類的時候使用
@SpringBootConfiguration public class DataSourceConfig { @Bean @Primary @ConfigurationProperties(prefix = "spring.datasource.commonunity") public DataSource commonunityDataSource() { return DataSourceBuilder.create().build(); } @Bean @ConfigurationProperties(prefix = "spring.datasource.flyway") public DataSource flywayDataSource() { return DataSourceBuilder.create().build(); } }
三、創建DataSourceTransactionManager、SqlSessionFactory、SqlSessionTemplate Bean
SqlSessionFactory:是MyBatis的關鍵對象,它是個單個數據庫映射關系經過編譯后的內存鏡像.SqlSessionFactory對象的實例可以通過SqlSessionFactoryBuilder對象類獲得,而SqlSessionFactoryBuilder則可以從XML配置文件或一個預先定制的Configuration的實例構建出SqlSessionFactory的實例.每一個MyBatis的應用程序都以一個SqlSessionFactory對象的實例為核心.同時SqlSessionFactory也是線程安全的,SqlSessionFactory一旦被創建,應該在應用執行期間都存在.在應用運行期間不要重復創建多次,建議使用單例模式.SqlSessionFactory是創建SqlSession的工廠
SqlSessionTemplate:是MyBatis-Spring的核心。這個類負責管理MyBatis的SqlSession,調用MyBatis的SQL方法,翻譯異常。SqlSessionTemplate是線程安全的,可以被多個DAO所共享使用。
當調用SQL方法時,包含從映射器getMapper()方法返回的方法,SqlSessionTemplate將會保證使用的SqlSession是和當前Spring的事務相關的。此外,它管理session的生命周期,包含必要的關閉,提交或回滾操作。
SqlSessionTemplate實現了SqlSession,這就是說要對MyBatis的SqlSession進行簡易替換。SqlSessionTemplate對象可以使用SqlSessionFactory作為構造方法的參數來創建
@SpringBootConfiguration @MapperScan(basePackages = {"com.ryj.test.multipleDataSource.dao.commonunity"},sqlSessionFactoryRef = "sqlSessionFactoryCommonunity" ) public class MybatisCommonunityConfig { @Autowired @Qualifier("commonunityDataSource") private DataSource commonunityDataSource; @Bean public DataSourceTransactionManager transactionManagerCommonunity() { return new DataSourceTransactionManager(commonunityDataSource); } @Bean public SqlSessionFactory sqlSessionFactoryCommonunity() throws Exception { SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); sessionFactory.setMapperLocations(resolver.getResources("classpath:/mapper/commonunity/*.xml")); sessionFactory.setDataSource(commonunityDataSource); return sessionFactory.getObject(); } @Bean public SqlSessionTemplate sqlSessionTemplateCommonunity() throws Exception { SqlSessionTemplate template = new SqlSessionTemplate(sqlSessionFactoryCommonunity()); // 使用上面配置的Factory return template; } }
@SpringBootConfiguration @MapperScan(basePackages = {"com.ryj.test.multipleDataSource.dao.flyway"},sqlSessionFactoryRef = "sqlSessionFactoryFlyway") public class MybatisFlywayConfig { @Autowired @Qualifier("flywayDataSource") private DataSource flywayDataSource; @Bean public DataSourceTransactionManager transactionManagerFlyway() { return new DataSourceTransactionManager(flywayDataSource); } @Bean public SqlSessionFactory sqlSessionFactoryFlyway() throws Exception { SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); sessionFactory.setMapperLocations(resolver.getResources("classpath:/mapper/flyway/*.xml")); sessionFactory.setDataSource(flywayDataSource); return sessionFactory.getObject(); } @Bean public SqlSessionTemplate sqlSessionTemplateFlyway() throws Exception { SqlSessionTemplate template = new SqlSessionTemplate(sqlSessionFactoryFlyway()); // 使用上面配置的Factory return template; } }