springboot 整合多数据源mysql oracle
时间: 2025-03-05 14:30:25 浏览: 42
### Spring Boot多数据源配置 MySQL 和 Oracle 示例教程
在Spring Boot项目中整合多个数据源(MySQL和Oracle)可以通过定义不同的`DataSource` bean来实现。对于每一个数据库连接,都需要指定独立的数据源配置类。
#### 配置文件设置
为了支持多种类型的数据库,在`application.properties`或`application.yml`中分别声明针对不同数据库的属性[^2]:
```yaml
spring.datasource.mysql.url=jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC
spring.datasource.mysql.username=root
spring.datasource.mysql.password=password
spring.datasource.mysql.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.oracle.url=jdbc:oracle:thin:@localhost:1521:orclpdb1
spring.datasource.oracle.username=sys as sysdba
spring.datasource.oracle.password=admin
spring.datasource.oracle.driver-class-name=oracle.jdbc.OracleDriver
```
#### 创建自定义配置类
为每种类型的数据源创建对应的Java配置类,以便于管理各自的连接池和其他参数。这里展示了一个简化版的例子用于说明目的[^1]:
##### MysqlConfig.java
```java
@Configuration
@PropertySource({"classpath:application.properties"})
@EnableJpaRepositories(
basePackages = "com.example.repository.mysql",
entityManagerFactoryRef = "mysqlEntityManager",
transactionManagerRef = "mysqlTransactionManager"
)
public class MysqlConfig {
@Autowired
private Environment env;
@Bean(name = "mysqlDataSource")
@Primary
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(env.getProperty("spring.datasource.mysql.driver-class-name"));
dataSource.setUrl(env.getProperty("spring.datasource.mysql.url"));
dataSource.setUsername(env.getProperty("spring.datasource.mysql.username"));
dataSource.setPassword(env.getProperty("spring.datasource.mysql.password"));
return dataSource;
}
// Other beans like EntityManager and Transaction Manager...
}
```
##### OracleConfig.java
```java
@Configuration
@PropertySource({"classpath:application.properties"})
@EnableJpaRepositories(
basePackages = "com.example.repository.oracle",
entityManagerFactoryRef = "oracleEntityManager",
transactionManagerRef = "oracleTransactionManager"
)
public class OracleConfig {
@Autowired
private Environment env;
@Bean(name = "oracleDataSource")
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(env.getProperty("spring.datasource.oracle.driver-class-name"));
dataSource.setUrl(env.getProperty("spring.datasource.oracle.url"));
dataSource.setUsername(env.getProperty("spring.datasource.oracle.username"));
dataSource.setPassword(env.getProperty("spring.datasource.oracle.password"));
return dataSource;
}
// Other beans like EntityManager and Transaction Manager...
}
```
上述代码片段展示了如何通过`@Configuration`注解定义两个单独的数据源bean,并利用`@EnableJpaRepositories`指明各自持久层接口所在的包路径。
#### 使用场景下的查询操作
当涉及到跨库查询时,则可以依赖于Spring Data JPA提供的API来进行交互。例如,如果想要执行SQL语句并映射结果到实体对象列表上,可采用如下方式[^3]:
```java
@Autowired
private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
// 假设这是来自某个服务方法内部的一部分逻辑
String sql = "SELECT * FROM users WHERE age > :age";
Map<String, Object> params = Collections.singletonMap("age", 18);
List<UserEntity> userList = this.namedParameterJdbcTemplate.query(sql,
params,
(rs, rowNum) -> new UserEntity(rs.getLong("id"), rs.getString("name")));
```
此部分假设已经注入了适当命名空间内的`NamedParameterJdbcTemplate`实例,它允许更灵活地处理带有占位符的SQL命令字符串。
阅读全文
相关推荐


















