springboot使用mybatis如何配置多数据源

本篇博客提供一个工程想连接多个数据库进行业务查询,在原先的单个数据库上进行配置实现多个数据库的使用,对于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&amp;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&amp;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&amp;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})

提示注意:

  1. 注意@Primary是将该数据源设置为主数据源;

  2. @MapperScan(basePackages = “com.xxx”,sqlSessionFactoryRef = “sourceSqlSessionFactory”)
    basePackages是扫描@Mapper所在的包路径

  3. sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
    .getResources(“classpath*:xxx/**/*Dao.xml”));//设置要扫描mapper接口对应的xml接

猜你喜欢

转载自blog.csdn.net/weixin_41349389/article/details/84291023