SpringBoot学习笔记---配置多数据源(Mybatis )

版权声明:帅气Dee海绵宝宝 https://blog.csdn.net/xyjcfucdi128/article/details/84983537

介绍

为什么配置多数据源,因为在实际业务需求中 数据的来源可能不是一个数据库中可进行配置两套数据源就可以避免跨库查询

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

猜你喜欢

转载自blog.csdn.net/xyjcfucdi128/article/details/84983537