1.配置两个数据源
# 数据源1配置
datasource1.url=jdbc:oracle:thin:@//your_oracle_host1:your_oracle_port1/your_oracle_sid1
datasource1.username=YourSchema1
datasource1.password=your_password1# 数据源2配置
datasource2.url=jdbc:oracle:thin:@//your_oracle_host2:your_oracle_port2/your_oracle_sid2
datasource2.username=YourSchema2
datasource2.password=your_password2
2.创建两个数据源对象
@Configuration
public class DataSourceConfig {@Primary@Bean(name = "dataSource1")@ConfigurationProperties(prefix = "datasource1")public DataSource dataSource1() {return DataSourceBuilder.create().build();}@Bean(name = "dataSource2")@ConfigurationProperties(prefix = "datasource2")public DataSource dataSource2() {return DataSourceBuilder.create().build();}
}
上面的 @Primary
注解表示 dataSource1
是默认的数据源。你可以根据实际需求来选择是否需要设置默认数据源。
3.配置 MyBatis SqlSessionFactory 和 MapperScannerConfigurer
在配置 MyBatis 时,你需要配置两个 SqlSessionFactory
对象,每个都使用对应的数据源。
@Configuration
@MapperScan(basePackages = "com.example.mapper1", sqlSessionFactoryRef = "sqlSessionFactory1")
public class MyBatisConfig1 {@Bean(name = "sqlSessionFactory1")public SqlSessionFactory sqlSessionFactory1(@Qualifier("dataSource1") DataSource dataSource) throws Exception {SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();factoryBean.setDataSource(dataSource);factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper1/*.xml"));return factoryBean.getObject();}// 可以配置事务管理器等其他属性
}@Configuration
@MapperScan(basePackages = "com.example.mapper2", sqlSessionFactoryRef = "sqlSessionFactory2")
public class MyBatisConfig2 {@Bean(name = "sqlSessionFactory2")public SqlSessionFactory sqlSessionFactory2(@Qualifier("dataSource2") DataSource dataSource) throws Exception {SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();factoryBean.setDataSource(dataSource);factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper2/*.xml"));return factoryBean.getObject();}// 可以配置事务管理器等其他属性
}
4. 创建 Mapper 接口和 XML 文件
分别创建两组 Mapper 接口和 XML 文件,每组对应一个数据源。例如,你可以有 com.example.mapper1
和 com.example.mapper2
两个包,分别放置两个数据源的 Mapper 接口和 XML 文件。
5. 在代码中使用
在代码中,你可以根据需要使用不同的 SqlSessionFactory
来获取相应的 SqlSession
,从而访问不同的数据库。
@Service
public class YourService {@Autowired@Qualifier("sqlSessionFactory1")private SqlSessionFactory sqlSessionFactory1;@Autowired@Qualifier("sqlSessionFactory2")private SqlSessionFactory sqlSessionFactory2;public void yourMethod() {try (SqlSession sqlSession1 = sqlSessionFactory1.openSession()) {// 使用 sqlSession1 访问数据源1的数据YourMapper1 mapper1 = sqlSession1.getMapper(YourMapper1.class);// ...} catch (Exception e) {// 处理异常}try (SqlSession sqlSession2 = sqlSessionFactory2.openSession()) {// 使用 sqlSession2 访问数据源2的数据YourMapper2 mapper2 = sqlSession2.getMapper(YourMapper2.class);// ...} catch (Exception e) {// 处理异常}}
}
上述代码中,YourMapper1
和 YourMapper2
是分别对应两个数据源的 Mapper 接口,你需要根据实际情况编写这两个接口。通过使用不同的 SqlSessionFactory
,你可以分别访问两个不同数据源的数据库。
注:摘自chatgpt