SpringBoot配置多个数据源(静态)

依赖项

<parent>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-parent</artifactId>
	<version>2.2.5.RELEASE</version>
	<relativePath /> 
</parent>
<dependencies>
    <dependency>
		<groupId>org.postgresql</groupId>
		<artifactId>postgresql</artifactId>
		<version>42.2.10</version>
		<scope>runtime</scope>
	</dependency>
	<dependency>
		<groupId>com.alibaba</groupId>
		<artifactId>druid</artifactId>
		<version>1.0.9</version>
	</dependency>
	<dependency>
		<groupId>com.baomidou</groupId>
		<artifactId>mybatis-plus-boot-starter</artifactId>
		<version>3.2.0</version>
	</dependency>
	<dependency>
		<groupId>com.baomidou</groupId>
		<artifactId>mybatis-plus-extension</artifactId>
		<version>3.4.0</version>
	</dependency>
	<dependency>
		<groupId>com.baomidou</groupId>
		<artifactId>mybatis-plus-generator</artifactId>
		<version>3.2.0</version>
		<scope>test</scope>
	</dependency>

多个数据源的配置信息

### 数据源信息
spring:
    datasource:
        authen:
            ### 认证数据源
            driver-class-name: org.postgresql.Driver
            jdbcUrl: jdbc:postgresql://ip1:port/performdb?currentSchema=*&useSSL=false&useUnicode=true&characterEncoding=UTF-8
            username: root
            password: ******
        monitor:
            ### 监控数据源
            driver-class-name: org.postgresql.Driver
            jdbcUrl: jdbc:postgresql://ip2:port/performdb?currentSchema=*&useSSL=false&useUnicode=true&characterEncoding=UTF-8
            username: root
            password: ******

mapper接口与会话工厂(数据源、sql文件)绑定

这里实现了mapper接口与不同的数据源&sql文件的绑定/关联,是实现多数据源的关键部分

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

import javax.sql.DataSource;

/**
 * mapper接口绑定到指定会话工厂(整合数据源、sql文件)
 */
@Configuration
@MapperScan(basePackages="com.telecom.authen.mapper", sqlSessionFactoryRef="authenSqlSessionFactory")
public class AuthenSqlSessionFactoryConfig {

    /**
     * 数据源Bean
     */
    /// @Primary
    @Bean(name = "authenDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.authen")
    public DataSource monitorDataSource() {
        // return DataSourceBuilder.create().type(com.zaxxer.hikari.HikariDataSource.class).build();
        return DataSourceBuilder.create().type(com.alibaba.druid.pool.DruidDataSource.class).build();
    }
    或者
    /**
     * 数据源Bean
     */
    /// @Primary
    @Bean(name = "authenDataSource")
    public DataSource alarmDataSource(@Value("${spring.datasource.authen.url}") String url,
                                        @Value("${spring.datasource.authen.username}") String username,
                                        @Value("${spring.datasource.authen.password}") String password,
                                        @Value("${spring.datasource.authen.driverClassName}") String driver) {

        HikariConfig config = new HikariConfig();
        config.setJdbcUrl(url);
        config.setUsername(username);
        config.setPassword(password);
        config.setDriverClassName(driver);
        // 构造时自动初始化连接池,功能类似DruidDataSource.init()
        HikariDataSource hikariDataSource = new HikariDataSource(config);
        return hikariDataSource;
    }

    /**
     * 会话工厂Bean【整合数据源、sql语句】
     */
    /// @Primary
    @Bean(name = "authenSqlSessionFactory")
    public SqlSessionFactory sqlSessionFactory(@Qualifier("authenDataSource") DataSource dataSource) throws Exception {

        // 设置数据源&sql语句
        MybatisSqlSessionFactoryBean sqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        sqlSessionFactoryBean.setMapperLocations(
                new PathMatchingResourcePatternResolver().getResources("classpath:/mapper/authen/*.xml"));

        // 设置分页插件
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.POSTGRE_SQL));
        sqlSessionFactoryBean.setPlugins(new Interceptor[]{interceptor});

        return sqlSessionFactoryBean.getObject();
    }

}

mapper接口

package com.telecom.authen.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.telecom.authen.model.Role;
import java.util.List;

/**
 * 角色信息Mapper接口
 */
public interface CscpRoleMapper extends BaseMapper<Role> {
    List<String> getRoleListByUsername(String username);
}

sql语句文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.telecom.authen.mapper.RoleMapper">
    <select id="getRoleListByUsername" parameterType="java.lang.String" resultType="java.lang.String">
        select C.name
        from user A
        inner join user_role B on A.id = B.user_id
        inner join roles     C on B.role_id = C.id
        where A.username = #{username}
    </select>
</mapper>

启动类中,禁止数据源的自动装载

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;

/// 禁止数据源的自动装载
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@MapperScan(