springboot如何連接兩個數據庫(多個)
一、啟動類
1.啟動類需要不用加mybatis的@MapperScan註解
@SpringBootApplication public class AppPush { public static void main(String[] args) { SpringApplication.run(AppPush.class,args); } }
二、application.yml文件
配置倆個或多個數據庫連接,我這裡用的是postgresql,用mysql等也是一樣
spring: datasource: # driver-class-name: org.postgresql.Driver # url: jdbc:postgresql://127.0.0.1/aaa # username: root # password: root one: driver-class-name: org.postgresql.Driver url: jdbc:postgresql://127.0.0.1/aaa username: root password: root two: driver-class-name: org.postgresql.Driver url: jdbc:postgresql://127.0.0.1/bbb username: root password: root
三、創建配置類
1.註意:@MapperScan 的basePackages就是你包的路徑 ,
sqlSessionFactoryRef 可以隨便起名 但是著兩個類不能重復!
One配置類
package com.wys.config; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.SqlSessionTemplate; import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.jdbc.datasource.DriverManagerDataSource; import javax.sql.DataSource; /** * @program: * @description: 數據庫配置1 * @author: wys * @create: 2019-12-03 16:20 **/ @Configuration @MapperScan(basePackages = "com.wys.mapper.**", sqlSessionFactoryRef = "oneSqlSessionFactory") public class OneDataSourceConfig { @Value("${spring.datasource.one.driver-class-name}") String driverClass; @Value("${spring.datasource.one.url}") String url; @Value("${spring.datasource.one.username}") String userName; @Value("${spring.datasource.one.password}") String passWord; @Primary @Bean(name = "oneDataSource") @ConfigurationProperties("spring.datasource.one") public DataSource masterDataSource() { DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName(driverClass); dataSource.setUrl(url); dataSource.setUsername(userName); dataSource.setPassword(passWord); return dataSource; } @Bean(name = "oneSqlSessionFactory") public SqlSessionFactory sqlSessionFactory(@Qualifier("oneDataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean(); sessionFactoryBean.setDataSource(dataSource); sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver() .getResources("classpath:mybatis/mapper-postgre/*.xml")); return sessionFactoryBean.getObject(); } @Bean(name = "oneSqlSessionTemplate") public SqlSessionTemplate sqlSessionFactoryTemplate(@Qualifier("oneSqlSessionFactory")SqlSessionFactory sqlSessionFactory ) throws Exception { return new SqlSessionTemplate(sqlSessionFactory); } }
Two配置類
package com.wys.config; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.SqlSessionTemplate; import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.jdbc.datasource.DriverManagerDataSource; import javax.sql.DataSource; /** * @program: * @description: 數據庫配置2 * @author: wys * @create: 2019-12-03 17:03 **/ @Configuration @MapperScan(basePackages = "com.wys.mappers",sqlSessionFactoryRef = "twoSqlSessionFactory") public class TwoDataSourceConfig { @Value("${spring.datasource.two.driver-class-name}") String driverClass; @Value("${spring.datasource.two.url}") String url; @Value("${spring.datasource.two.username}") String userName; @Value("${spring.datasource.two.password}") String passWord; @Bean(name = "twoDataSource") @ConfigurationProperties("spring.datasource.two") public DataSource masterDataSource(){ DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName(driverClass); dataSource.setUrl(url); dataSource.setUsername(userName); dataSource.setPassword(passWord); return dataSource; } @Bean(name = "twoSqlSessionFactory") public SqlSessionFactory sqlSessionFactory(@Qualifier("twoDataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean(); sessionFactoryBean.setDataSource(dataSource); sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver() .getResources("classpath:mybatis/mapper-postgres/*.xml")); return sessionFactoryBean.getObject(); } @Bean(name = "twoSqlSessionTemplate") public SqlSessionTemplate sqlSessionFactoryTemplate(@Qualifier("twoSqlSessionFactory")SqlSessionFactory sqlSessionFactory ) throws Exception { return new SqlSessionTemplate(sqlSessionFactory); } }
四 、結構
可能有人不清楚項目的結構,我在下面放瞭一張類結構圖,能更清晰和方便理解。
註意:和之前的項目的主要區別就是 mapper包多瞭一個,mapper的xml包也多瞭一個,不同的數據庫mapper放到不同的包內就可以瞭。
五、多數據源的事物問題
在使用多數據源時,有可能會遇到事物失敗的問題。我單獨總結瞭一個文章。需要的話可以閱讀一下。@Transactional註解異常報錯之多數據源.
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- @Transactional註解異常報錯之多數據源詳解
- SpringBoot整合mybatis常見問題(小結)
- Springboot如何同時裝配兩個相同類型數據庫
- 教你使用springboot配置多數據源
- SpringBoot整合Mybatis Plus多數據源的實現示例