今天在项目上碰到需要去读不同库的需求,自己看了一些博客,感觉网上的很繁琐,我们可以通过配置类的形式来切换数据源,指定不同的mapper文件读不同的库,指定不同的Dao层。

涉密部分已打码

1.准备两个数据库配置文件

mybatis plus 整合pgSQL动态切换schema mybatis 切换数据库_mysql


2.两个配置文件的内容

# JDBC 配置(驱动类自动从url的mysql识别,数据源类型自动识别)
# 或spring.datasource.aj.url=
spring.datasource.aj.druid.url=${SPRING_DATASOURCE_AJ_DRUID_URL:jdbc:mysql://XX.XXX.XXX.XXX:端口/库名?useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull}
spring.datasource.aj.druid.username=${SPRING_DATASOURCE_AJ_DRUID_USERNAME:账号}
spring.datasource.aj.druid.password=${SPRING_DATASOURCE_AJ_DRUID_PASSWORD:密码}
spring.datasource.aj.druid.driver-class-name=${SPRING_DATASOURCE_DRUID_DRIVER_CLASS_NAME:com.mysql.jdbc.Driver}

#连接池配置(通常来说,只需要修改initialSize、minIdle、maxActive
# 如果用Oracle,则把poolPreparedStatements配置为true,mysql可以配置为false。分库分表较多的数据库,建议配置为false。removeabandoned不建议在生产环境中打开如果用SQL Server,建议追加配置)
spring.datasource.aj.druid.initial-size=${SPRING_DATASOURCE_DRUID_INITIAL_SIZE:1}
spring.datasource.aj.druid.max-active=${SPRING_DATASOURCE_DRUID_MAX_ACTIVE:20}
spring.datasource.aj.druid.min-idle=${SPRING_DATASOURCE_DRUID_MIN_IDLE:1}
# 配置获取连接等待超时的时间
spring.datasource.aj.druid.max-wait=${SPRING_DATASOURCE_DRUID_MAX_WAIT:60000} 
#打开PSCache,并且指定每个连接上PSCache的大小
spring.datasource.aj.druid.pool-prepared-statements=${SPRING_DATASOURCE_DRUID_POOL_PREPARED_STATEMENTS:true}
spring.datasource.aj.druid.max-pool-prepared-statement-per-connection-size=${SPRING_DATASOURCE_DRUID_MAX_POOL_PREPARED_STATEMENT_PER_CONNECTION_SIZE:20}
#spring.datasource.aj.druid.max-aj-prepared-statements=和上面的等价
spring.datasource.aj.druid.validation-query=${SPRING_DATASOURCE_DRUID_VALIDATION_QUERY:SELECT 'x'}
#spring.datasource.aj.druid.validation-query-timeout=
spring.datasource.aj.druid.test-on-borrow=${SPRING_DATASOURCE_DRUID_TEST_ON_BORROW:false}
spring.datasource.aj.druid.test-on-return=${SPRING_DATASOURCE_DRUID_TEST_ON_RETURN:false}
spring.datasource.aj.druid.test-while-idle=${SPRING_DATASOURCE_DRUID_TEST_WHILE_IDLE:true}
#配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
spring.datasource.aj.druid.time-between-eviction-runs-millis=${SPRING_DATASOURCE_DRUID_TIME_BETWEEN_EVICTION_RUNS_MILLIS:60000}
#配置一个连接在池中最小生存的时间,单位是毫秒
spring.datasource.aj.druid.min-evictable-idle-time-millis=${SPRING_DATASOURCE_DRUID_MIN_EVICTABLE_IDLE_TIME_MILLIS:300000}
#spring.datasource.aj.druid.max-evictable-idle-time-millis=
#配置多个英文逗号分隔
spring.datasource.aj.druid.filters=${SPRING_DATASOURCE_DRUID_FILTERS:stat}

# WebStatFilter配置,说明请参考Druid Wiki,配置_配置WebStatFilter
#是否启用StatFilter默认值true
spring.datasource.aj.druid.web-stat-filter.enabled=${SPRING_DATASOURCE_DRUID_FILTER_ENABLE:true}
spring.datasource.aj.druid.web-stat-filter.url-pattern=${SPRING_DATASOURCE_DRUID_FILTER_URL_PATTERN:/*}
spring.datasource.aj.druid.web-stat-filter.exclusions=${SPRING_DATASOURCE_DRUID_FILTER_EXCLUSIONS:*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*}
spring.datasource.aj.druid.web-stat-filter.session-stat-enable=${SPRING_DATASOURCE_DRUID_FILTER_SESSION_STAT_ENABLE:false}
spring.datasource.aj.druid.web-stat-filter.session-stat-max-count=${SPRING_DATASOURCE_DRUID_FILTER_SESSION_STAT_MAX_COUNT:1000}
spring.datasource.aj.druid.web-stat-filter.principal-session-name=${SPRING_DATASOURCE_DRUID_FILTER_PRINCIPAL_SESSION_NAME:admin}
spring.datasource.aj.druid.web-stat-filter.principal-cookie-name=${SPRING_DATASOURCE_DRUID_FILTER_PRINCIPAL_COOKIE_NAME:admin}
spring.datasource.aj.druid.web-stat-filter.profile-enable=${SPRING_DATASOURCE_DRUID_FILTER_PROFILE_ENABLE:TRUE}

# StatViewServlet配置
#展示Druid的统计信息,StatViewServlet的用途包括:1.提供监控信息展示的html页面2.提供监控信息的JSON API
#是否启用StatViewServlet默认值true
spring.datasource.aj.druid.stat-view-servlet.enabled=${SPRING_DATASOURCE_DRUID_VIEW_ENABLE:TRUE}
#根据配置中的url-pattern来访问内置监控页面,如果是上面的配置,内置监控页面的首页是/druid/index.html例如:
#http://110.76.43.235:9000/druid/index.html
#http://110.76.43.235:8080/mini-web/druid/index.html
spring.datasource.aj.druid.stat-view-servlet.url-pattern=${SPRING_DATASOURCE_DRUID_VIEW_URL_PATTERN:/druid/*}
#允许清空统计数据
spring.datasource.aj.druid.stat-view-servlet.reset-enable=${SPRING_DATASOURCE_DRUID_VIEW_RESET_ENABLE:TRUE}
spring.datasource.aj.druid.stat-view-servlet.login-username=${SPRING_DATASOURCE_DRUID_VIEW_LOGIN_USERNAME:admin}
spring.datasource.aj.druid.stat-view-servlet.login-password=${SPRING_DATASOURCE_DRUID_VIEW_LOGIN_PASSWORD:admin}

配置文件中,命名一定要不同 spring.datasource.XX.druid
eg:第一个为spring.datasource.aaa.druid
第二个位spring.datasource.bbb.druid

3.编写配置类(细节看代码注释)

@Data
@Configuration
// 前缀为spring.datasource.druid的配置信息,此注解里的内容为你要读取那个配置文件!!!,一定要和配置文件中的命名一样 
@ConfigurationProperties(prefix = "spring.datasource.aj.druid")
//扫描dao层目录
@MapperScan(basePackages = "com.linewell.aj.demo.dao", sqlSessionFactoryRef = "ajSqlSessionFactory")
public class AjDataBaseConfig {

    /**
     * dao层的包路径
     */
    static final String PACKAGE = "com.linewell.aj.demo.dao";

    /**
     * mapper文件的相对路径
     * 路径这里写你想扫描的路径
     */
    private static final String MAPPER_LOCATION = "classpath:mybatis/mapper/**/*.xml";

    /**
     * 数据连接池的属性(读取你@ConfigurationProperties注解标识的properties文件里的属性)
     * 直接复制
     */
    private String filters;
    private String url;
    private String username;
    private String password;
    private String driverClassName;
    private int initialSize;
    private int minIdle;
    private int maxActive;
    private long maxWait;
    private long timeBetweenEvictionRunsMillis;
    private long minEvictableIdleTimeMillis;
    private String validationQuery;
    private boolean testWhileIdle;
    private boolean testOnBorrow;
    private boolean testOnReturn;
    private boolean poolPreparedStatements;
    private int maxPoolPreparedStatementPerConnectionSize;

    // 主数据源使用@Primary注解进行标识,我这里不是主数据源就不加了
    @Bean(name = "ajDataSource")
    public DataSource ajDataSource() throws SQLException {
        DruidDataSource druid = new DruidDataSource();


        // 配置基本属性
        druid.setDriverClassName(driverClassName);
        druid.setUsername(username);
        druid.setPassword(password);
        druid.setUrl(url);
        //初始化时建立物理连接的个数
        druid.setInitialSize(initialSize);
        //最大连接池数量
        druid.setMaxActive(maxActive);
        //最小连接池数量
        druid.setMinIdle(minIdle);
        //获取连接时最大等待时间,单位毫秒。
        druid.setMaxWait(maxWait);
        //间隔多久进行一次检测,检测需要关闭的空闲连接
        druid.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
        //一个连接在池中最小生存的时间
        druid.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
        //用来检测连接是否有效的sql
        druid.setValidationQuery(validationQuery);
        //建议配置为true,不影响性能,并且保证安全性。
        druid.setTestWhileIdle(testWhileIdle);
        //申请连接时执行validationQuery检测连接是否有效
        druid.setTestOnBorrow(testOnBorrow);
        druid.setTestOnReturn(testOnReturn);
        //是否缓存preparedStatement,也就是PSCache,oracle设为true,mysql设为false。分库分表较多推荐设置为false
        druid.setPoolPreparedStatements(poolPreparedStatements);
        // 打开PSCache时,指定每个连接上PSCache的大小
        druid.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);

        return druid;
    }

    // 创建该数据源的事务管理
    // 主数据源使用@Primary注解进行标识,我这里不是主数据源就不加了
    @Bean(name = "ajTransactionManager")
    public DataSourceTransactionManager ajTransactionManager(@Qualifier("ajDataSource") DataSource ajDataSource) throws SQLException {
        return new DataSourceTransactionManager(ajDataSource);
    }

    // 创建Mybatis的连接会话工厂实例
    // 主数据源使用@Primary注解进行标识,我这里不是主数据源就不加了
    @Bean(name = "ajSqlSessionFactory")
    public SqlSessionFactory ajSqlSessionFactory(@Qualifier("ajDataSource") DataSource ajDataSource) throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(ajDataSource);  // 设置数据源bean
        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources(AjDataBaseConfig.MAPPER_LOCATION));  // 设置mapper文件路径

        return sessionFactory.getObject();
    }
}

这样springboot会去加载这个配置类,扫描指定的Dao层和mapper文件,添加指定的数据库配置。有多个数据源就写多个配置类,内容都和上面一样,路径修改一下就行。