在之前的分享中,我們介紹了如何使用目前最常用的三種數(shù)據(jù)訪問方式:
下面我們將分三篇來介紹在這三種數(shù)據(jù)訪問方式之下,當我們需要多個數(shù)據(jù)源的時候,該如何使用的配置說明。
添加多數(shù)據(jù)源的配置
先在Spring Boot的配置文件application.properties
中設置兩個你要鏈接的數(shù)據(jù)庫配置,比如這樣:
spring.datasource.primary.jdbc-url=jdbc:mysql://localhost:3306/test1
spring.datasource.primary.username=root
spring.datasource.primary.password=123456
spring.datasource.primary.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.secondary.jdbc-url=jdbc:mysql://localhost:3306/test2
spring.datasource.secondary.username=root
spring.datasource.secondary.password=123456
spring.datasource.secondary.driver-class-name=com.mysql.cj.jdbc.Driver
說明與注意:
- 多數(shù)據(jù)源配置的時候,與單數(shù)據(jù)源不同點在于
spring.datasource
之后多設置一個數(shù)據(jù)源名稱primary
和secondary
來區(qū)分不同的數(shù)據(jù)源配置,這個前綴將在后續(xù)初始化數(shù)據(jù)源的時候用到。 - 數(shù)據(jù)源連接配置2.x和1.x的配置項是有區(qū)別的:2.x使用
spring.datasource.secondary.jdbc-url
,而1.x版本使用spring.datasource.secondary.url
。如果你在配置的時候發(fā)生了這個報錯java.lang.IllegalArgumentException: jdbcUrl is required with driverClassName.
,那么就是這個配置項的問題。
初始化數(shù)據(jù)源與JdbcTemplate
完成多數(shù)據(jù)源的配置信息之后,就來創(chuàng)建個配置類來加載這些配置信息,初始化數(shù)據(jù)源,以及初始化每個數(shù)據(jù)源要用的JdbcTemplate。你只需要在你的Spring Boot應用下添加下面的這個配置類即可完成!
@Configuration
public class DataSourceConfiguration {
@Primary
@Bean
@ConfigurationProperties(prefix = "spring.datasource.primary")
public DataSource primaryDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties(prefix = "spring.datasource.secondary")
public DataSource secondaryDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
public JdbcTemplate primaryJdbcTemplate(@Qualifier("primaryDataSource") DataSource primaryDataSource) {
return new JdbcTemplate(primaryDataSource);
}
@Bean
public JdbcTemplate secondaryJdbcTemplate(@Qualifier("secondaryDataSource") DataSource secondaryDataSource) {
return new JdbcTemplate(secondaryDataSource);
}
}
說明與注意:
- 前兩個Bean是數(shù)據(jù)源的創(chuàng)建,通過
@ConfigurationProperties
可以知道這兩個數(shù)據(jù)源分別加載了spring.datasource.primary.*
和spring.datasource.secondary.*
的配置。 @Primary
注解指定了主數(shù)據(jù)源,就是當我們不特別指定哪個數(shù)據(jù)源的時候,就會使用這個Bean- 后兩個Bean是每個數(shù)據(jù)源對應的
JdbcTemplate
??梢钥吹竭@兩個JdbcTemplate
創(chuàng)建的時候,分別注入了primaryDataSource
數(shù)據(jù)源和secondaryDataSource
數(shù)據(jù)源
測試一下
完成了上面之后,我們就可以寫個測試類來嘗試一下上面的多數(shù)據(jù)源配置是否正確了,比如下面這樣:
@RunWith(SpringRunner.class)
@SpringBootTest
public class Chapter37ApplicationTests {
@Autowired
protected JdbcTemplate primaryJdbcTemplate;
@Autowired
protected JdbcTemplate secondaryJdbcTemplate;
@Before
public void setUp() {
primaryJdbcTemplate.update("DELETE FROM USER ");
secondaryJdbcTemplate.update("DELETE FROM USER ");
}
@Test
public void test() throws Exception {
// 往第一個數(shù)據(jù)源中插入 2 條數(shù)據(jù)
primaryJdbcTemplate.update("insert into user(name,age) values(?, ?)", "aaa", 20);
primaryJdbcTemplate.update("insert into user(name,age) values(?, ?)", "bbb", 30);
// 往第二個數(shù)據(jù)源中插入 1 條數(shù)據(jù),若插入的是第一個數(shù)據(jù)源,則會主鍵沖突報錯
secondaryJdbcTemplate.update("insert into user(name,age) values(?, ?)", "ccc", 20);
// 查一下第一個數(shù)據(jù)源中是否有 2 條數(shù)據(jù),驗證插入是否成功
Assert.assertEquals("2", primaryJdbcTemplate.queryForObject("select count(1) from user", String.class));
// 查一下第一個數(shù)據(jù)源中是否有 1 條數(shù)據(jù),驗證插入是否成功
Assert.assertEquals("1", secondaryJdbcTemplate.queryForObject("select count(1) from user", String.class));
}
}
說明與注意:
- 可能這里你會問,有兩個JdbcTemplate,為什么不用
@Qualifier
指定?這里順帶說個小知識點,當我們不指定的時候,會采用參數(shù)的名字來查找Bean,存在的話就注入。 - 這兩個JdbcTemplate創(chuàng)建的時候,我們也沒指定名字,它們是如何匹配上的?這里也是一個小知識點,當我們創(chuàng)建Bean的時候,默認會使用方法名稱來作為Bean的名稱,所以這里就對應上了。大家不妨回頭看看兩個名稱是不是一致的?
注:本文轉載自“程序猿DD”,如有侵權,請聯(lián)系刪除!