在springboot+mybatisplus中,可以通过在application.yml文件中配置不同的数据源,并使用Spring的@Conditional注解来根据driver-class-name自动选择使用哪个数据源。
首先,在application.yml中定义两个数据源:
spring:
datasource:
# mysql 数据源配置
mysql:
url: jdbc:mysql://localhost:3306/mydatabase?useUnicode=true&characterEncoding=utf-8&useSSL=false
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
# oracle 数据源配置
oracle:
url: jdbc:oracle:thin:@localhost:1521:orcl
username: scott
password: tiger
driver-class-name: oracle.jdbc.driver.OracleDriver
mybatis-plus:
configuration:
map-underscore-to-camel-case: true
然后,在代码中使用@Conditional注解根据driver-class-name来选择使用哪个数据源。例如:
@Configuration
public class DataSourceConfig {
@Bean
@ConfigurationProperties("spring.datasource.mysql")
@Conditional(DriverClassNameCondition.class)
public DataSource mysqlDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties("spring.datasource.oracle")
@Conditional(DriverClassNameCondition.class)
public DataSource oracleDataSource() {
return DataSourceBuilder.create().build();
}
}
class DriverClassNameCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
Environment env = context.getEnvironment();
String className = env.getProperty("spring.datasource.driver-class-name");
return "com.mysql.jdbc.Driver".equals(className) || "oracle.jdbc.driver.OracleDriver".equals(className);
}
}
在这个例子中,我们定义了两个数据源(mysql和oracle),并使用@Conditional注解根据driver-class-name来选择使用哪个数据源。具体来说,在DataSourceConfig类中,我们定义了两个名为mysqlDataSource和oracleDataSource的@Bean方法。这些方法使用@ConfigurationProperties注解来从application.yml文件中读取对应的数据源配置,并返回一个DataSource实例。
然后,在DriverClassNameCondition类中,我们根据driver-class-name属性的值来判断是否需要加载mysqlDataSource或者oracleDataSource。如果driver-class-name的值是com.mysql.jdbc.Driver,则加载mysqlDataSource;如果driver-class-name的值是oracle.jdbc.driver.OracleDriver,则加载oracleDataSource。
最后,我们可以在其他地方使用@Autowired注解来自动注入mysqlDataSource或者oracleDataSource。例如:
@Service
public class MyService {
private final JdbcTemplate jdbcTemplate;
@Autowired
public MyService(DataSource dataSource) {
jdbcTemplate = new JdbcTemplate(dataSource);
}
// ...
}
在这个例子中,我们在MyService类的构造函数中注入了一个DataSource实例。Spring会根据我们在DataSourceConfig类中定义的@Bean方法自动选择mysqlDataSource或者oracleDataSource,并将它作为参数传递给构造函数。我们可以使用这个DataSource实例来执行数据库操作。