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,然後會自動建立使用該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