springboot多数据源

来源:互联网 发布:js windows.onload 编辑:程序博客网 时间:2024/05/22 04:50

在开发中多数情况下都会用到好多的数据源在springboot中配置多数据源

文件目录


俩个数据源分开配置

UserDbProperties

package com.megvii.springbootmybatismutildatasource.dbsource;import com.alibaba.druid.pool.DruidDataSource;import javax.sql.DataSource;import lombok.Data;import org.apache.ibatis.session.SqlSessionFactory;import org.mybatis.spring.SqlSessionFactoryBean;import org.mybatis.spring.annotation.MapperScan;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.Primary;import org.springframework.jdbc.datasource.DataSourceTransactionManager;/** * @Auther: chenqingyang * @Description */@Configuration//扫描Mapper 接口并管理容器@MapperScan(basePackages = UserDbProperties.PACKAGE,    sqlSessionFactoryRef = "userSqlSessionFactory")public @Dataclass UserDbProperties {  Logger logger = LoggerFactory.getLogger( UserDbProperties.class );  static final String PACKAGE =      "com.megvii.springbootmybatismutildatasource.mapper.usermapper";  @Value("${userDb.url}")  private String url;  @Value("${userDb.user}")  private String user;  @Value("${userDb.password}")  private String password;  @Value("${userDb.driverClass}")  private String driverClass;  /**   * 定义数据源   */  @Primary  @Bean(name = "userDbSource")  public DataSource userDbSource() {    DruidDataSource dataSource = new DruidDataSource();    logger.info( "UserDBSource driverClass is ({})", driverClass );    dataSource.setDriverClassName( driverClass );    logger.info( "UserDBSource url is ({})", url );    dataSource.setUrl( url );    logger.info( "UserDBSource user is ({})", user );    dataSource.setUsername( user );    logger.info( "UserDBSource password is ({})", password );    dataSource.setPassword( password );    logger.info( "Link to database userDbSource,({},{},{},{})",        driverClass, url, user, password );    return dataSource;  }  /**   * 事务管理器   */  @Primary  @Bean(name = "userTransactionManager")  public DataSourceTransactionManager userTransactionManager() {    return new DataSourceTransactionManager( userDbSource() );  }  /**   * 创建工厂   */  /**   * @param userDbSource 数据源   * @return 工厂   */  @Primary  @Bean(name = "userSqlSessionFactory")  public SqlSessionFactory fileSqlSessionFactory(      @Qualifier("userDbSource") DataSource userDbSource) throws Exception {    final SqlSessionFactoryBean sqlSessionFactoryBean =        new SqlSessionFactoryBean();    sqlSessionFactoryBean.setDataSource( userDbSource );    return sqlSessionFactoryBean.getObject();  }}

其中我们特别需要注意其中几个地方

@Data lombok (有兴趣的可以看一下)

@primary 重中之中 必须要有的注解 在其中的一个数据源中有就行 它可以解决我们俩个数据源不知道用哪个的问题 没有这个注解会报错

FileDbProperties

package com.megvii.springbootmybatismutildatasource.dbsource;import com.alibaba.druid.pool.DruidDataSource;import javax.sql.DataSource;import lombok.Data;import org.apache.ibatis.session.SqlSessionFactory;import org.mybatis.spring.SqlSessionFactoryBean;import org.mybatis.spring.annotation.MapperScan;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.jdbc.datasource.DataSourceTransactionManager;/** * @Auther: chenqingyang * @Description */@Configuration//扫描Mapper 接口并管理容器@MapperScan(basePackages = FileDbProperties.PACKAGE,    sqlSessionFactoryRef = "fileSqlSessionFactory")public @Data class FileDbProperties {  /**   * 精确到确切的mapper目录,以便跟其他数据源隔离   */  static final String PACKAGE =      "com.megvii.springbootmybatismutildatasource.mapper.filemapper";  Logger logger = LoggerFactory.getLogger( FileDbProperties.class );  @Value("${fileDb.url}")  private String url;  @Value("${fileDb.user}")  private String user;  @Value("${fileDb.password}")  private String password;  @Value("${fileDb.driverClass}")  private String driverClass;  /**   * 定义数据源   */  @Bean(name = "fileDbSource")  public DataSource fileDbSource() {    DruidDataSource dataSource = new DruidDataSource();    logger.info( "fileDBSource driverClass is ({})", driverClass );    dataSource.setDriverClassName( driverClass );    logger.info( "fileDBSource url is ({})", url );    dataSource.setUrl( url );    logger.info( "fileDBSource user is ({})", user );    dataSource.setUsername( user );    logger.info( "fileDBSource password is ({})", password );    dataSource.setPassword( password );    logger.info( "Link to database fileDbSource,({},{},{},{})",        driverClass, url, user, password );    return dataSource;  }  /**   * 事务管理器   */  @Bean(name = "fileTransactionManager")  public DataSourceTransactionManager fileTransactionManager() {    return new DataSourceTransactionManager( fileDbSource() );  }  /**   * 创建工厂   */  /**   * @param fileDbSource 数据源   * @return 工厂   */  @Bean(name = "fileSqlSessionFactory")  public SqlSessionFactory fileSqlSessionFactory(      @Qualifier("fileDbSource") DataSource fileDbSource) throws Exception {    final SqlSessionFactoryBean sqlSessionFactoryBean =        new SqlSessionFactoryBean();    sqlSessionFactoryBean.setDataSource( fileDbSource );    return sqlSessionFactoryBean.getObject();  }}

使用的时候因为我们指定了每个数据源支持的mapper,所以使用的时候直接写mapper就行了

源码地址:https://github.com/qyngchen/springbootmutil