springboot 整合mybaties帶多個數據源

springboot集成了mybaties,默認情況下只需指定spring運行的配置文件,你可以不用做些什麼,mapper的數據源會自動加載,但對於多數據源時該怎麼配置呢?
首先看看我的目錄樹,我的項目需要訪問兩個跨域的數據庫源。你需要做的事如下:

1. springboot的啓動類指定exclude,這項屬性在舊版是在@EnableAutoConfiguration設置。@MapperScan設置爲projectName.mapper所在的主包,見上圖。酌情修改

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class,
    DataSourceTransactionManagerAutoConfiguration.class, MybatisAutoConfiguration.class})
@MapperScan("gocron_manager_system.mapper")

2.配置文件,編寫數據源,如下:屏蔽關鍵字,但並不影響閱讀。數據連接信息最後一個點之前的可隨意命名,但末尾的必須一致。springboot 2.0前 jdbc-url 需改成 url

server.port=9527

#數據鏈接1
datasource.ultraman.jdbc-url=jdbc:mysql://xxx:3306/xxx?characterEncoding=utf-8&useAffectedRows=true
datasource.ultraman.username=xx
datasource.ultraman.password=xx
datasource.ultraman.driverClassName=com.mysql.jdbc.Driver

#數據鏈接2
datasource.clouddev.jdbc-url=jdbc:mysql://xxx:3306/xxx?characterEncoding=utf-8&useAffectedRows=true
datasource.clouddev.username=xx
datasource.clouddev.password=xx
datasource.clouddev.driverClassName=com.mysql.jdbc.Driver

3.mapper類,有幾個數據源,創建幾個。我的mapper是以註解方式實現,並未使用xml。且是接口,不需要編寫實現類

@Mapper
@Repository
public interface UltramanMapper {

  @Select("Select task_id, run_freq FROM t_project WHERE id=#{ultramanId}")
  UltramanProject getUltramanProject(@Param("ultramanId") int ultramanId);

}

4.編寫與數據源相對的config類,有幾個數據源就得創建幾個類。需要注意設置@MapperScan的basePackage指向你的mapper類所在的包。裏面的一些Bean名稱,注意一致。對於沒使用xml實現mapper的,sqlSessionFactory方法getResources("classpath*:mapper/clouddev/*.xml"))可以隨意,不用創建目錄

#####cloddev數據源,config類

@Configuration
@MapperScan(basePackages = "gocron_manager_system.mapper.clouddev", sqlSessionFactoryRef = "clouddevSqlSessionFactory")
public class ClouddevDataSourceConfig {

  @Primary
  @Bean(name = "clouddevDataSource")
  @ConfigurationProperties("datasource.clouddev")
  public DataSource masterDataSource() {
    return DataSourceBuilder.create().build();
  }

  @Bean(name = "clouddevSqlSessionFactory")
  public SqlSessionFactory sqlSessionFactory(@Qualifier("clouddevDataSource") DataSource dataSource)
      throws Exception {
    SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
    sessionFactoryBean.setDataSource(dataSource);
    sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
        .getResources("classpath*:mapper/clouddev/*.xml"));
    return sessionFactoryBean.getObject();
  }

}

 #####ultraman數據源,config類

@Configuration
@MapperScan(basePackages = "gocron_manager_system.mapper.ultraman", sqlSessionFactoryRef = "ultramanSqlSessionFactory")
public class UltramanDataSourceConfig {

  @Primary
  @Bean(name = "ultramanDataSource")
  @ConfigurationProperties("datasource.ultraman")
  public DataSource masterDataSource() {
    return DataSourceBuilder.create().build();
  }

  @Bean(name = "ultramanSqlSessionFactory")
  public SqlSessionFactory sqlSessionFactory(@Qualifier("ultramanDataSource") DataSource dataSource)
      throws Exception {
    SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
    sessionFactoryBean.setDataSource(dataSource);
    sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
        .getResources("classpath*:mapper/ultraman/*.xml"));
    return sessionFactoryBean.getObject();
  }

}

4.使用的時候,自動注入即可進行方法的調用

  @Autowired
  private LogMetaMapper logMetaMapper;

  @Autowired
  private UltramanMapper ultramanMapper;

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章