Spring Boot + Mybatis 多数据源配置(静态)

记录一下静态 Spring Boot  多数据源配置

应用场景

      项目需要读取多个数据库A、B, A库(pms)为主要操作库,B库(confluence)只是单纯读取数据

多数据源

      首先,将Spring Boot自带的DataSourceAutoConfiguration禁用掉, 因为它会自动读取配置文件中的spring.datasource.* 属性并配置单数据源,在启动类中

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class StartApplication extends SpringBootServletInitializer {


    public static void main(String[] args) {
        SpringApplication.run(StartApplication.class, args);
    }

}

然后是配置文件代码application.yml 

spring:
  datasource:
    # A库 
    pms:
      driver-class-name: com.mysql.jdbc.Driver
      url: jdbc:mysql://******/name?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&useSSL=false
      username: 
      password: 
    # B库
    confluence:
      driver-class-name: com.mysql.jdbc.Driver
      url: jdbc:mysql://**/name?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&useSSL=false
      username:  
      password:  

下一步需要配置多数据源

@Configuration
public class DataSourceConfig {

    @Bean(name = "pms")
    // prefix的值是yml文件的属性
    @ConfigurationProperties(prefix = "spring.datasource.pms")
    // A库 设置为默认数据库
    @Primary
    public DataSource pms() {
        return DruidDataSourceBuilder.create().build();
    }

    @Bean(name = "confluence")
    @ConfigurationProperties(prefix = "spring.datasource.confluence")
    public DataSource confluence() {
        // DataSourceBuilder.create().build() 这样数据监听会失效
        return DruidDataSourceBuilder.create().build();
    }

}

接下来是 两个配置类

@Configuration
// 扫描Mapper 的位置, sqlSessionFactoryRef  的值是 SqlSessionFactory 的方法名(confluenceSqlSessionFactory)
@MapperScan(basePackages = {"db.confluence.mapper"}, sqlSessionFactoryRef = "confluenceSqlSessionFactory")
public class MybatisConfluenceConfig {

    @Autowired
    @Qualifier("confluence")
    private DataSource confluence;

    @Bean
    public SqlSessionFactory confluenceSqlSessionFactory() throws Exception {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(confluence);
        // 读取mapper文件的位置,不添加可能会报错 找不到mapper文件
        sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/confluence/*.xml"));
        return sqlSessionFactoryBean.getObject();
    }

    @Bean
    public SqlSessionTemplate confluenceSqlSessionTemplate() throws Exception {
        SqlSessionTemplate sqlSessionTemplate = new SqlSessionTemplate(confluenceSqlSessionFactory());
        return sqlSessionTemplate;
    }
}
@Configuration
@MapperScan(basePackages = {"db.pms.mapper"}, sqlSessionFactoryRef = "pmsSqlSessionFactory")
public class MybatisPmsConfig {

    @Autowired
    @Qualifier("pms")
    private DataSource pms;

    @Bean
    public SqlSessionFactory pmsSqlSessionFactory() throws Exception {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(pms);
        sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/pms/*.xml"));
        return sqlSessionFactoryBean.getObject();
    }

    @Bean
    public SqlSessionTemplate pmsSqlSessionTemplate() throws Exception {
        SqlSessionTemplate sqlSessionTemplate = new SqlSessionTemplate(pmsSqlSessionFactory());
        return sqlSessionTemplate;
    }
}

当访问到 db.pms.mapper和 db.confluence.mapper     前者是A库, 后者是B库

配置完成,当访问到相对应的包下会自动切换到你所配置的数据源。

本人菜鸟,有问题一同讨论

猜你喜欢

转载自blog.csdn.net/m0_38076274/article/details/81704471