一、配置数据源信息
app.datasource.db1.url=jdbc:mysql://localhost:3306/db1?characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false
app.datasource.db1.username=root
app.datasource.db1.password=root
app.datasource.db1.driver-class-name=com.mysql.jdbc.Driver
app.datasource.db2.url=jdbc:mysql://localhost:3306/db2?characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false
app.datasource.db2.username=root
app.datasource.db2.password=root
app.datasource.db2.driver-class-name=com.mysql.jdbc.Driver
二、进行注入
@Configuration
public class JdbcDataSourceConfig {
@Bean
@ConfigurationProperties(prefix = "app.datasource.db1")
public DataSourceProperties db1DataSourceProperties(){
return new DataSourceProperties();
}
@Bean
@ConfigurationProperties(prefix = "app.datasource.db2")
public DataSourceProperties db2DataSourceProperties(){
return new DataSourceProperties();
}
@Bean
public DataSource db1DataSource(){
return db1DataSourceProperties().initializeDataSourceBuilder().build();
}
@Bean
public DataSource db2DataSource(){
return db2DataSourceProperties().initializeDataSourceBuilder().build();
}
@Bean(name = "db1JdbcTemplate")
public JdbcTemplate db1JdbcTemplate(){
return new JdbcTemplate(db1DataSource());
}
@Bean(name = "db2JdbcTemplate")
public JdbcTemplate db2JdbcTemplate(){
return new JdbcTemplate(db2DataSource());
}
}
@ConfigurationProperties:与@Configuration作用一样声明为一个配置类。 我们尝试启动这个SpringBoot: 发现出现了错误,错误的原因也很直观,就是说原本单例的数据源出现多个。导入不知道注入哪个而报错,那么如何解决? 解决的办法有两种: 一:使用@Primary注解:我们在上面JdbcDataSourceConfig类中的db1相关配置中加入此注解;
@Primary
@Bean
@ConfigurationProperties(prefix = "app.datasource.db1")
public DataSourceProperties db1DataSourceProperties(){
return new DataSourceProperties();
}
@Primary
@Bean
public DataSource db1DataSource(){
return db1DataSourceProperties().initializeDataSourceBuilder().build();
}
再次启动,启动成功 二:在启动类中配置移除自带的数据信息
@SpringBootApplication(exclude = {
DataSourceAutoConfiguration.class,
DataSourceTransactionManagerAutoConfiguration.class
})
public class SpringBootStarterDemoApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootStarterDemoApplication.class, args);
}
}
启动,同样成功。
三、测试@SpringBootTest
class SpringBootStarterDemoApplicationTests {
@Test
void contextLoads() {
}
@Autowired
JdbcTemplate db2JdbcTemplate;
@Autowired
DataSource dataSource;
@Test
public void addDataData(){
String sql = "insert into user_info(name,age) values('ccc',18)";
db2JdbcTemplate.execute(sql);
}
}
我们在切换数据源到db1: 修改一下注入的name即可。
@SpringBootTest
class SpringBootStarterDemoApplicationTests {
@Test
void contextLoads() {
}
@Autowired
JdbcTemplate db1JdbcTemplate;
@Autowired
DataSource dataSource;
@Test
public void addDataData(){
String sql = "insert into user_info(name,age) values('ccc',18)";
db1JdbcTemplate.execute(sql);
}
}
db1中也有了数据。
到此,简单的多数据配置就成功了,如果您发现有不正确的地方,恳请批评指出,在此感谢!