# 数据源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
@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
是默认的数据源。你可以根据实际需求来选择是否需要设置默认数据源。?
在配置 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();
}
// 可以配置事务管理器等其他属性
}
分别创建两组 Mapper 接口和 XML 文件,每组对应一个数据源。例如,你可以有 com.example.mapper1
和 com.example.mapper2
两个包,分别放置两个数据源的 Mapper 接口和 XML 文件。
在代码中,你可以根据需要使用不同的 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