SpringBoot(四):SpringBoot集成多数据源

一、多数据源

1、多数据库源就是指在web项目中链接多个数据库
2、好处:我要用到A数据库(mysql)中 的某些数据进行数据验证,并且要将数据插入B数据库中。这样做的好处是,不需要改变A中数据库的结构,就算是连接更多数据库的话,都不需要考虑其中结构问题,但是这就需要一个web项目跟多个数据库进行连接操作的技术。

二、操作步骤

1、配置多数据库源

spring.datasource.datasourceA.url=jdbc:mysql://localhost:3306/db_user?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
spring.datasource.datasourceA.username=root
spring.datasource.datasourceA.password=root
spring.datasource.datasourceA.driver-class-name=com.mysql.jdbc.Driver

spring.datasource.datasourceB.url=jdbc:mysql://localhost:3306/db_test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
spring.datasource.datasourceB.username=root
spring.datasource.datasourceB.password=root
spring.datasource.datasourceB.driver-class-name=com.mysql.jdbc.Driver

相比于之前的单一数据源

spring.datasource.url=jdbc:mysql://localhost:3306/db_user?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

2、为每个数据源配置一个加载类

package cn.lemon.demo.config;

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.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.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;


@Configuration
@MapperScan(basePackages = "cn.lemon.demo.dao.IUserDaoA", sqlSessionTemplateRef = "datasourceASqlSessionTemplate")
public class DataSourceAConfig {
     

    @Bean(name = "datasourceADataSource")
    @ConfigurationProperties(prefix = "spring.datasource.datasourceA")
    //primary代表主库
    @Primary
    public DataSource dataSourceA() {
     
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "datasourceBSqlSessionFactory")
    @Primary
    public SqlSessionFactory dataSourceASqlSessionFactory(@Qualifier("datasourceADataSource") DataSource dataSource) throws Exception {
     
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        return bean.getObject();
    }

    @Bean(name = "DatasourceATransactionManager")
    @Primary
    public DataSourceTransactionManager dataSourceTransactionManager(@Qualifier("datasourceADataSource") DataSource dataSource) {
     
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "DatasourceASqlSessionTemplate")
    @Primary
    public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("datasourceASqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
     
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}
package cn.lemon.demo.config;

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.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.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;


@Configuration
@MapperScan(basePackages = "cn.lemon.demo.dao.IUserDaoB", sqlSessionTemplateRef = "datasourceBSqlSessionTemplate")
public class DataSourceBConfig {
     

    @Bean(name = "datasourceBDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.datasourceB")
    public DataSource dataSourceB() {
     
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "datasourceBSqlSessionFactory")
    public SqlSessionFactory dataSourceBSqlSessionFactory(@Qualifier("datasourceBDataSource") DataSource dataSource) throws Exception {
     
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        return bean.getObject();
    }

    @Bean(name = "DatasourceBTransactionManager")
    public DataSourceTransactionManager dataSourceBTransactionManager(@Qualifier("datasourceBDataSource") DataSource dataSource) {
     
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "DatasourceBSqlSessionTemplate")
    public SqlSessionTemplate dataSouceBSqlSessionTemplate(@Qualifier("datasourceBSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
     
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

3、总结:
这样的话就配置完成,可以调用不用的Mapper,实际上是存储在不同的库中。
这里大家会发现如果使用事务并且制造一个异常的话,会很明显的出现几种不同的效果,我们让mapper1和mapper2在不同顺序下面插入数据并且在中间抛出异常,发现只有一个插入成功了,另外一个没成功,为什么呢?就是因为@Primary的原因,这样就设置了主数据库。这里会发现设置了Primary的数据库只要出错都不会插入成功,都会事务回滚,大家注意了!!!!!

你可能感兴趣的:(Spring,Boot,mysql,intellij,idea,java)