Mybatis多資料來源(一) 不同的mapper檔案對應不同的資料來源
一、背景
如果一個系統存在多個業務資料庫,那麼就意味著在該系統中存在多個數據源,此時針對資料庫的操作如何讓其具體的落地到某個庫中呢?
二、解決辦法
一個解決辦法就是mybatis不同的mapper檔案對應不同的資料來源,這樣service在操作不同的mapper時即操作了不同的資料來源
三、實現
1、yml檔案中配置多個數據源spring: datasource: druid: old: driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver url: xxx username: xxx password: xxx initial-size: 5 max-active: 10 max-wait: 10000 validationQuery: SELECT 1 new: driver-class-name: com.mysql.cj.jdbc.Driver url: xxx username: xxx password: xxx initial-size: 5 max-active: 10 max-wait: 10000 validationQuery: SELECT 1
2、配置檔案中配置資料來源,資料庫的session工廠以及事務管理器
`@Configuration
public class DataSourceConfigNew {
/** * 返回dataSourceNew資料庫的資料來源 */ @Bean(name = "dataSourceNew") @Primary//主資料來源 @ConfigurationProperties(prefix = "spring.datasource.druid.new") public DataSource dataSourceNew() { return new DruidDataSource(); } /** * 返回dataSourceNew資料庫的會話工廠 */ @Bean(name = "dataSqlSessionFactoryNew") @Primary public SqlSessionFactory sqlSessionFactoryNew(@Qualifier("dataSourceNew") DataSource ds) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:/mapper/new/*.xml")); bean.setDataSource(ds); return bean.getObject(); } /** * 返回dataSourceNew資料庫的事務 */ @Bean(name = "dataTransactionManagerNew") @Primary public DataSourceTransactionManager transactionManager1(@Qualifier("dataSourceNew") DataSource ds) { return new DataSourceTransactionManager(ds); }
}`
3、為mapper檔案指定對應的資料來源@Configuration @MapperScan(basePackages = "com.test.mapper.newMapper", sqlSessionFactoryRef = "dataSqlSessionFactoryNew") public class DataSourceConfigNew { }