配置多个datasource数据源

转载自:https://xli1224.github.io/2018/03/11/spring-mybatis-multiple-datasource/

Mybatis 在 Spring 下使用多数据源
一个 Spring Application 连接多个数据源的问题。一部分 Mapper 使用数据源 A,另一部分 Mapper 使用数据源 B。就是在 MapperScan 的时候,指定不同的 SqlSessionFactory即可。使用 Spring


        
        
        
        
    


    
        
        
        
            
                mappers=tk.mybatis.mapper.common.Mapper
            
        
    


        
        
        
        
    


    
        
        
        
            
                mappers=tk.mybatis.mapper.common.Mapper
            
        
    


使用 Spring Boot
主要是需要创建两个Configuration,里面分别实现了 DataSource 的创建(读取application yml 里面特定的属性),TransactionManager 的创建,以及最重要的,sqlSessionFactory 的创建。通过创建不同的 sqlSessionFactory,配置读取不同的 mapper 文件。

@Configuration
@MapperScan(basePackages = MasterDatasourceConfig.Package, sqlSessionFactoryRef = "masterSqlSessionFactory")
public class MasterDatasourceConfig {

    static final String Package = " cn.*.master";

    static final String MAPPER_LOCATION = "classpath:mapper/master/*.xml";

    @Value("${master.datasource.url}")
    private String url;

    @Value("${master.datasource.username}")
    private String user;

    @Value("${master.datasource.password}")
    private String password;

    @Value("${master.datasource.driver}")
    private String driverClass;

    @Bean(name = "masterDataSource")
    @Primary
    public DataSource masterDataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(this.driverClass);
        dataSource.setUrl(this.url);
        dataSource.setUsername(this.user);
        dataSource.setPassword(this.password);
        return dataSource;
    }

    @Bean(name = "masterTransactionManager")
    @Primary
    public DataSourceTransactionManager masterTransactionManager(){
        return new DataSourceTransactionManager((masterDataSource()));
    }

    @Bean(name = "masterSqlSessionFactory")
    @Primary
    public SqlSessionFactory masterSqlSessionFactory(@Qualifier("masterDataSource") DataSource masterDataSource)
            throws Exception {
        final SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
        sessionFactoryBean.setDataSource(masterDataSource);
        sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
        .getResources(MasterDatasourceConfig.MAPPER_LOCATION));

        return sessionFactoryBean.getObject();
    }
}
@Configuration
@MapperScan(basePackages = SlaveDatasourceConfig.Package, sqlSessionFactoryRef = "slaveSqlSessionFactory")
public class SlaveDatasourceConfig {

    static final String Package = "cn.*.slave";

    static final String MAPPER_LOCATION = "classpath:mapper/slave/*.xml";

    @Value("${slave.datasource.url}")
    private String url;

    @Value("${slave.datasource.username}")
    private String user;

    @Value("${slave.datasource.password}")
    private String password;

    @Value("${slave.datasource.driver}")
    private String driverClass;

    @Bean(name = "slaveDataSource")
    public DataSource slaveDataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(this.driverClass);
        dataSource.setUrl(this.url);
        dataSource.setUsername(this.user);
        dataSource.setPassword(this.password);
        return dataSource;
    }

    @Bean(name = "slaveTransactionManager")
    public DataSourceTransactionManager slaveTransactionManager(){
        return new DataSourceTransactionManager((slaveDataSource()));
    }

    @Bean(name = "slaveSqlSessionFactory")
    public SqlSessionFactory slaveSqlSessionFactory(@Qualifier("slaveDataSource") DataSource slaveDataSource)
            throws Exception {
        final SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
        sessionFactoryBean.setDataSource(slaveDataSource);
        sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
        .getResources(SlaveDatasourceConfig.MAPPER_LOCATION));

        return sessionFactoryBean.getObject();
    }
}


如果说是单数据源的情况下,绑定 mybatis 是非常简单的。配置文件里面配置 spring datasource即可,其他都是自动的,包括创建 SqlSessionFactory。

你可能感兴趣的:(spring,boot)