-
1.數據源掃描的mapper路徑要對應:分包配置,兩種包格式
-
2.數據源讀取對應的配置名稱要對應
-
3.主配置數據源和主事務一定加 @Priamry
目錄結構:分包配置
步驟:
- 1.創建兩個/多個數據庫
- 2.resources/application.properties 配置多個數據源配置
-
#數據源配置 #數據源1 主數據源 spring.datasource.sbtest1.driverClassName=com.mysql.jdbc.Driver spring.datasource.sbtest1.url=jdbc:mysql://localhost:3306/sbtest1?useUnicode=true&characterEncoding=utf-8 spring.datasource.sbtest1.username=root spring.datasource.sbtest1.password=root #數據源2 spring.datasource.sbtest2.driverClassName=com.mysql.jdbc.Driver spring.datasource.sbtest2.url=jdbc:mysql://localhost:3306/sbtest2?useUnicode=true&characterEncoding=utf-8 spring.datasource.sbtest2.username=root spring.datasource.sbtest2.password=root
- 3.主數據源 datasource/DataSource01.class
//註解到springboot容器中 @Configuration //對應目錄結構1 @MapperScan(basePackages = "com.zjc.sbtest1.mapper", sqlSessionFactoryRef = "sbtest1SqlSessionFactory") //對應目錄結構2 //@MapperScan(basePackages = "com.zjc.mapper.sbtest1", sqlSessionFactoryRef = "sbtest1SqlSessionFactory") public class DataSource01 { //獲取sbtest1數據庫的數據源 @Bean(name = "sbtest1DataSource") @Primary //主數據源 //prefix前綴名和application.properties中對應的數據源一樣 @ConfigurationProperties(prefix = "spring.datasource.sbtest1") public DataSource dateSource() { return DataSourceBuilder.create().build(); } //返回sbtest1數據庫的會話工廠 @Bean(name = "sbtest1SqlSessionFactory") public SqlSessionFactory sqlSessionFactory(@Qualifier("sbtest1DataSource") DataSource ds) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(ds); return bean.getObject(); } //返回sbtest1數據庫的事務 @Bean(name = "sbtest1TransactionManager") @Primary //主事務 public DataSourceTransactionManager transactionManager(@Qualifier("sbtest1DataSource") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } //返回sbtest1數據庫的會話模版 @Bean(name = "sbtest1SqlSessionTemplate") public SqlSessionTemplate sqlSessionTemplate( @Qualifier("sbtest1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception { return new SqlSessionTemplate(sqlSessionFactory); } }
-
3.配置其他數據源DataSource02.class
- 一個應用只能有一個主數據源和主事務,可以有多個非主數據源和事務。只在主數據源中寫兩個@priamary,其它數據源和事務不能寫
-
//註解到springboot容器中 @Configuration //對應目錄結構1 @MapperScan(basePackages = "com.zjc.sbtest2.mapper", sqlSessionFactoryRef = "sbtest2SqlSessionFactory") //對應目錄結構2 //@MapperScan(basePackages = "com.zjc.mapper.sbtest2", sqlSessionFactoryRef = "sbtest2SqlSessionFactory") public class DataSource02 { //返回sbtest2數據庫的數據源 @Bean(name = "sbtest2DataSource") @ConfigurationProperties(prefix = "spring.datasource.sbtest2") public DataSource dateSource() { return DataSourceBuilder.create().build(); } //返回sbtest2數據庫的會話工廠 @Bean(name = "sbtest2SqlSessionFactory") public SqlSessionFactory sqlSessionFactory(@Qualifier("sbtest2DataSource") DataSource ds) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(ds); return bean.getObject(); } //返回sbtest2數據庫的事務 @Bean(name = "sbtest2TransactionManager") public DataSourceTransactionManager transactionManager(@Qualifier("sbtest2DataSource") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } //返回sbtest2數據庫的會話模版 @Bean(name = "sbtest2SqlSessionTemplate") public SqlSessionTemplate sqlSessionTemplate( @Qualifier("sbtest2SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception { return new SqlSessionTemplate(sqlSessionFactory); } }
- 4.App.class
-
//根據目錄結構選擇掃描路徑 @EnableAutoConfiguration //@MapperScan(basePackages = "com.zjc.mapper") @ComponentScan(basePackages = {"com.zjc.web", "com.zjc.sbtest1","com.zjc.sbtest2","com.zjc.datasource"}) //@ComponentScan(basePackages = {"com.zjc.web", "com.zjc.service","com.zjc.datasource"}) public class App { public static void main(String[] args) { SpringApplication.run(App.class, args); } }