介绍
为什么配置多数据源,因为在实际业务需求中 数据的来源可能不是一个数据库中可进行配置两套数据源就可以避免跨库查询
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,然后会自动创建使用该DataSource的SqlSessionFactoryBean以及SqlSessionTemplate。会自动扫描你的Mappers,连接到SqlSessionTemplate,
application 中的 配置
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/wangmx?characterEncoding=utf-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
多数据源的配置
首先,我们必须在application.property中自定义两个数据源的配置,一个使用first.datasource.*,另一个使second.datasource.*,为了能使别人一眼看出连接的是什么库,可以使用数据库命名,比如wangmx库,则可以使用wangmx.datasource.*,在使用多数据源的时候,所有必要配置都不能省略。
application 中的配置
first.spring.datasource.driverClassName=com.mysql.jdbc.Driver
first.spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test1?characterEncoding=utf-8&useSSL=false
first.spring.datasource.username=root
first.spring.datasource.password=root
second.spring.datasource.driverClassName=com.mysql.jdbc.Driver
second.spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test2?characterEncoding=utf-8&useSSL=false
second.spring.datasource.username=root
second.spring.datasource.password=root
之前一个数据源是在application的添加扫描扫描相应的 mapper.xml 的位置 然后根据mapper.xml找到相应dao的位置,现在多数据源就不能在application中进行配置了,所有我这里创建了两个配置类进行作用是用于,扫描相对应的mapper.xml和dao 和找到相应的数据源
配置类创建
1. first.spring.datasource
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.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.core.io.support.ResourcePatternResolver;
import javax.sql.DataSource;
/**
* wangmx
*/
@Configuration
@MapperScan(basePackages={"com.wangmx.test1.test1Dao.dao"},sqlSessionTemplateRef="userSqlSessionTemplate")
public class UserMybatisConfig{
@Bean(name = "userDataSource")
@Primary
@ConfigurationProperties(prefix = "first.spring.datasource")
public DataSource userDataSource(){
return DataSourceBuilder.create().build();
}
@Bean
public SqlSessionFactory userSqlSessionFactory(@Qualifier("userDataSource") DataSource dataSource){
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
//添加XML目录
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
try {
bean.setMapperLocations(resolver.getResources("classpath:mybatis/test1/*.xml"));
return bean.getObject();
}catch (Exception e){
e.printStackTrace();
throw new RuntimeException(e);
}
}
@Bean
public SqlSessionTemplate userSqlSessionTemplate(@Qualifier("userSqlSessionFactory") SqlSessionFactory sqlSessionFactory){
SqlSessionTemplate template = new SqlSessionTemplate(sqlSessionFactory);
return template;
}
}
2. second.spring.datasource
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.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.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import javax.sql.DataSource;
/**
* wangmx
*/
@Configuration
@MapperScan(basePackages={"com.wangmx.test2.test1Dao.dao"},sqlSessionTemplateRef="secondSqlSessionTemplate")
public class DataportalMybatisConfig {
@Bean
@ConfigurationProperties(prefix = "second.spring.datasource")
public DataSource secondDataSource(){
return DataSourceBuilder.create().build();
}
@Bean
public SqlSessionFactory secondSessionFactory(@Qualifier("secondDataSource") DataSource dataSource){
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
//添加XML目录
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
try {
bean.setMapperLocations(resolver.getResources("classpath:mybatis/test2/*.xml"));
return bean.getObject();
}catch (Exception e){
e.printStackTrace();
throw new RuntimeException(e);
}
}
@Bean
public SqlSessionTemplate secondSqlSessionTemplate(@Qualifier("secondSessionFactory") SqlSessionFactory sqlSessionFactory){
SqlSessionTemplate template = new SqlSessionTemplate(sqlSessionFactory);
return template;
}
}
@Primary 注解
该注解表示在同一个接口有多个实现类可以注入的时候,默认选择哪一个,而不是让autowire注解报错,官网要求当
多个数据源时,必须指定一个datasource,另一个datasource则不用添加。
@Qualifier 注解
根据名称进行注入,通常是在具有相同的多个类型的实例的一个注入(例如有多个DataSource类型的实例)。
@MapperScan(basePackages = {"com.user.server.dao"}, sqlSessionTemplateRef = "userSqlSessionTemplate")
basePackages为mapper所在的包,sqlSessionTemplateRef要引用的实例。
本文借鉴的 地址:https://blog.csdn.net/mxw2552261/article/details/78640062