本篇博客提供一个工程想连接多个数据库进行业务查询,在原先的单个数据库上进行配置实现多个数据库的使用,对于springboot以及mybatis不在此进行展开介绍,只需要把代码按照步骤一步步粘贴进你的项目,调整一下就能实现;
简单介绍单个数据源配置
pom文件导入依赖
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.1</version>
</dependency>
默认情况下,如果在application.yml或application.property中指定了spring.datasource.*的相关配置参数,Spring Boot就会使用该配置创建一个DataSource。Spring Boot会自动为我们配置好一个DataSource,就会自动配置一个内存数据库的DataSource。
然后会自动创建使用该DataSource的SqlSessionFactoryBean以及SqlSessionTemplate。会自动扫描你的Mappers,连接到SqlSessionTemplate,并注册到Spring上下文中。
spring:
datasource:
primary:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/database?useUnicode=true&characterEncoding=utf-8
username: root
password: admin
max-idle: 10
max-wait: 10000
min-idle: 5
initial-size: 5
validation-query: SELECT 1
mybatis
mapperLocations: classpath*:xxx/**/*Dao.xml
多个数据源配置
在application.yml或application.property中指定多个数据源
spring:
datasource:
primary:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/database?useUnicode=true&characterEncoding=utf-8
username: root
password: admin
max-idle: 10
max-wait: 10000
min-idle: 5
initial-size: 5
validation-query: SELECT 1
source:
driver-class-name: com.mysql.jdbc.Driver
url: mysql://localhost:3306/database2?useUnicode=true&characterEncoding=utf-8
username: root
password: admin
max-idle: 10
max-wait: 10000
min-idle: 5
initial-size: 5
validation-query: SELECT 1
创建主配置类
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
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 javax.sql.DataSource;
@Configuration
@MapperScan(basePackages = "com.xxx",sqlSessionFactoryRef = "primarySqlSessionFactory")//basePackages是扫描@Mapper所在的包路径
public class PrimaryDataSourceConfig {
@Primary
@Bean(name = "primaryDataSource")
@ConfigurationProperties("spring.datasource.primary") //配置文件中对应的配置项
public DataSource masterDataSource(){
return DataSourceBuilder.create().build();
}
@Primary
@Bean(name = "primarySqlSessionFactory")
public SqlSessionFactory sqlSessionFactory(@Qualifier("primaryDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
sessionFactoryBean.setDataSource(dataSource);
sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources("classpath*:mapper/**/*Dao.xml"));//设置要扫描mapper接口对应的xml接口文件
return sessionFactoryBean.getObject();
}
}
创建第二个数据源配置类
import source.apache.ibatis.session.SqlSessionFactory;
import source.mybatis.spring.SqlSessionFactoryBean;
import source.mybatis.spring.annotation.MapperScan;
import source.springframework.beans.factory.annotation.Qualifier;
import source.springframework.boot.context.properties.ConfigurationProperties;
import source.springframework.boot.jdbc.DataSourceBuilder;
import source.springframework.context.annotation.Bean;
import source.springframework.context.annotation.Configuration;
import source.springframework.context.annotation.Primary;
import source.springframework.core.io.support.PathMatchingResourcePatternResolver;
import javax.sql.DataSource;
@Configuration
@MapperScan(basePackages = "com.xxx",sqlSessionFactoryRef = "sourceSqlSessionFactory")//basePackages是扫描@Mapper所在的包路径
public class SourceDataSourceConfig {
@Bean(name = "sourceDataSource")
@ConfigurationProperties("spring.datasource.source")//配置文件中对应的配置项
public DataSource masterDataSource(){
return DataSourceBuilder.create().build();
}
@Bean(name = "sourceSqlSessionFactory")
public SqlSessionFactory sqlSessionFactory(@Qualifier("sourceDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
sessionFactoryBean.setDataSource(dataSource);
sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources("classpath*:xxx/**/*Dao.xml"));//设置要扫描mapper接口对应的xml接口文件
return sessionFactoryBean.getObject();
}
}
修改启动类
在启动类上添加该注解,用于屏蔽spingboot启动myBatisAutoConfig默认配置;使用exclude启动时,加载自己配置的多数据源;
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class,DataSourceTransactionManagerAutoConfiguration.class, MybatisAutoConfiguration.class})
提示注意:
-
注意@Primary是将该数据源设置为主数据源;
-
@MapperScan(basePackages = “com.xxx”,sqlSessionFactoryRef = “sourceSqlSessionFactory”)
basePackages是扫描@Mapper所在的包路径 -
sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources(“classpath*:xxx/**/*Dao.xml”));//设置要扫描mapper接口对应的xml接