springboot mybatis 使用Druid配置多数据源

先奉上项目GitHub地址:https://github.com/ChaseDreamBoy/SpringBootMultipleDataSources

一、pom.xml 依赖

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.xh</groupId>
    <artifactId>SpringBootMultipleDataSources</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>war</packaging>

    <name>SpringBootMultipleDataSources Maven Webapp</name>
    <!-- FIXME change it to the project's website -->
    <url>http://www.example.com</url>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.9.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.2</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
        <!-- 多数据源 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.4</version>
        </dependency>
    </dependencies>

    <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/**</include>
                </includes>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/**</include>
                </includes>
            </resource>
        </resources>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <configuration>
                    <!-- 不指定单元测试 -->
                    <skipTests>true</skipTests>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3.2</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
        </plugins>
        <finalName>SpringBootMultipleDataSources</finalName>
    </build>
</project>

二、项目结构

springboot mybatis 使用Druid配置多数据源

三、配置多数据源

打开 application.properties 文件, 修改相应的数据源配置,比如数据源地址、账号、密码等。(如果不是用 MySQL,自行添加连接驱动 pom,然后修改驱动名配置。)
这里我只用了两个数据源,其中的key可以自定义,在与获取数据源信息的时候对应即可。

### the first datasource start ###
jdbc1.driverClassName = com.mysql.jdbc.Driver
jdbc1.url = jdbc:mysql://127.0.0.1:3306/mytest?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8&useSSL=false
jdbc1.username = root
jdbc1.password = password
### the first datasource end ###

### the second datasource start ###
jdbc2.driverClassName = com.mysql.jdbc.Driver
jdbc2.url = jdbc:mysql://ip:3306/db?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8&useSSL=false
jdbc2.username = root
jdbc2.password = password
### the second datasource end ###

四、数据源配置

其中代码的意思已经在注释中了。只是注意在获取对应数据源信息的时候和properties文件中的key对应。

package com.xh.config.mdbs;

import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
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.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;

/**
 * @author xiaohe
 * @version V1.0.0
 * @Description: Configuration注解 -- 使类似于配置文件
 *      MapperScan注解 -- 扫描Mapper接口交给容器管理
 *          basePackages - 数据源对应dao层的包,并把包中的接口交给容器管理(指定基包)
 *          sqlSessionFactoryRef - 表示定义了key,表示一个唯一SqlSessionFactory实例,
 *              对应下面生成的SqlSessionFactory
 * @date: 2018-10-14 16:10
 */
@Configuration
@MapperScan(basePackages = DB1DataSourceConfig.PACKAGE, sqlSessionFactoryRef = "db1SqlSessionFactory")
public class DB1DataSourceConfig {

    // 每一个数据源对应dao层一个包,精确到那个包的目录,以便跟其他数据源隔离
    static final String PACKAGE = "com.xh.dao.db1";
    // 接口对应的xml文件
    private static final String MAPPER_LOCATION = "classpath:com/xh/mapper/db1/*.xml";
    // 有的项目把xml文件放到src/main/resources下,就把MAPPER_LOCATION换为下面的
//    private static final String MAPPER_LOCATION = "classpath:mapper/*.xml";

    @Value("${jdbc1.url}")
    private String url;

    @Value("${jdbc1.username}")
    private String user;

    @Value("${jdbc1.password}")
    private String password;

    @Value("${jdbc1.driverClassName}")
    private String driverClass;

    // 创建数据源
    // @Primary 标志这个 Bean 如果在多个同类 Bean 候选时,该 Bean 优先被考虑。多数据源配置的时候注意,必须要有一个主数据源,用 @Primary 标志该 Bean
    @Bean(name = "db1DataSource")
    @Primary
    public DataSource db1DataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driverClass);
        dataSource.setUrl(url);
        dataSource.setUsername(user);
        dataSource.setPassword(password);
        return dataSource;
    }

    // 配置事务管理器
    @Bean(name = "db1TransactionManager")
    @Primary
    public DataSourceTransactionManager db1TransactionManager() {
        return new DataSourceTransactionManager(db1DataSource());
    }

    // 根据数据源创建SqlSessionFactory
    // @Qualifier 根据名称进行注入,通常是在具有相同的多个类型的实例的一个注入(例如有多个DataSource类型的实例)
    @Bean(name = "db1SqlSessionFactory")
    @Primary
    public SqlSessionFactory db1SqlSessionFactory(@Qualifier("db1DataSource") DataSource db1DataSource)
            throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        // 指定数据源(这个必须有,否则报错)
        sessionFactory.setDataSource(db1DataSource);
        // 指定*.xml文件,如果整个持久层操作不需要使用到xml文件的话(只用注解就可以搞定),则不加
        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources(DB1DataSourceConfig.MAPPER_LOCATION));
        return sessionFactory.getObject();
    }
}

同样的方式配置db2的数据源。
这种多数据源配置,每一个数据源对应dao层一个包(每一个数据源的xml也分开),以便跟其他数据源隔离,使用的时候只需要调用对应的dao就可以了,至于该dao层对应的数据源在config中配置。
然后mapper、dao层、server层、controller层和一般的一样。
具体demo项目可以参照github地址 - https://github.com/ChaseDreamBoy/SpringBootMultipleDataSources