Mybatis多數據源配置
連接配置
既然有多個數據源,因為數據庫用戶名密碼可能不相同,所以是需要配置多個數據源信息的,直接在 properties/yml
中配置即可。這里要注意根據配置的屬性名進行區分,同時因為數據源要有一個默認使用的數據源,最好在名稱上有所區分(這里使用 primary 作為主數據源標識)。
########################## 主數據源 ##################################
spring.datasource.primary.jdbc-url=jdbc:mysql://127.0.0.1:3306/demo1?characterEncoding=utf-8&serverTimezone=GMT%2B8
spring.datasource.primary.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.primary.username=root
spring.datasource.primary.password=
########################## 第二個數據源 ###############################
spring.datasource.datasource2.jdbc-url=jdbc:mysql://127.0.0.1:3306/demo2?characterEncoding=utf-8&serverTimezone=GMT%2B8
spring.datasource.datasource2.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.datasource2.username=root
spring.datasource.datasource2.password=
# mybatis
mybatis.mapper-locations=classpath:mapper/*.xml
mybatis.type-aliases-package=com.wdbyte.domain
注意,配置中的數據源連接 url 末尾使用的是 jdbc-url
.
因為使用了 Mybatis 框架,所以 Mybatis 框架的配置信息也是少不了的,指定掃描目錄 mapper
下的mapper xml
配置文件。
多數據源配置
上面你應該看到了,到目前為止和 Mybatis 單數據源寫法唯一的區別就是 Mapper 接口使用不同的目錄分開了,那么這個不同點一定會在數據源配置中體現。
主數據源
開始配置兩個數據源信息,先配置主數據源,配置掃描的 MapperScan
目錄為 com.wdbyte.mapper.primary
/**
* 主數據源配置
*
* @author niujinpeng
* @website: https://www.wdbyte.com
* @date 2020/12/19
*/
@Configuration
@MapperScan(basePackages = {"com.wdbyte.mapper.primary"}, sqlSessionFactoryRef = "sqlSessionFactory")
public class PrimaryDataSourceConfig {
@Bean(name = "dataSource")
@ConfigurationProperties(prefix = "spring.datasource.primary")
@Primary
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "sqlSessionFactory")
@Primary
public SqlSessionFactory sqlSessionFactory(@Qualifier("dataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml"));
return bean.getObject();
}
@Bean(name = "transactionManager")
@Primary
public DataSourceTransactionManager transactionManager(@Qualifier("dataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "sqlSessionTemplate")
@Primary
public SqlSessionTemplate sqlSessionTemplate(@Qualifier("sqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
和單數據源不同的是這里把
dataSource
sqlSessionFactory
transactionManager
sqlSessionTemplate
都單獨進行了配置,簡單的 bean 創建,下面是用到的一些注解說明。
@ConfigurationProperties(prefix = "spring.datasource.primary")
:使用spring.datasource.primary 開頭的配置。@Primary
:聲明這是一個主數據源(默認數據源),多數據源配置時必不可少。@Qualifier
:顯式選擇傳入的 Bean。
第二個數據源
第二個數據源和主數據源唯一不同的只是 MapperScan
掃描路徑和創建的 Bean 名稱,同時沒有 @Primary
主數據源的注解。
/**
* 第二個數據源配置
*
* @author niujinpeng
* @website: https://www.wdbyte.com
* @date 2020/12/19
*/
@Configuration
@MapperScan(basePackages = {"com.wdbyte.mapper.datasource2"}, sqlSessionFactoryRef = "sqlSessionFactory2")
public class SecondDataSourceConfig {
@Bean(name = "dataSource2")
@ConfigurationProperties(prefix = "spring.datasource.datasource2")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "sqlSessionFactory2")
public SqlSessionFactory sqlSessionFactory(@Qualifier("dataSource2") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml"));
return bean.getObject();
}
@Bean(name = "transactionManager2")
public DataSourceTransactionManager transactionManager(@Qualifier("dataSource2") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "sqlSessionTemplate2")
public SqlSessionTemplate sqlSessionTemplate(@Qualifier("sqlSessionFactory2") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
注意:因為已經在兩個數據源中分別配置了掃描的 Mapper 路徑,如果你之前在 SpringBoot 啟動類中也使用了 Mapper 掃描注解,需要刪掉。