springboot如何连接两个数据库(多个)
时间:2022-10-22 13:56:56|栏目:JAVA代码|点击: 次
一、启动类
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注解异常报错之多数据源.