Springboot mybatis多数据源配置

2018-09-12 / 17 阅读 / Java

当前环境

springboot 2.0.3
jdk1.8

多数据源配置

与单数据源不同的是不需要配置默认的spring.datasource,应为Spring自动配置加载到默认的就不会启动自定义的数据源配置类。

第一步、数据源

分别为表test1和test2

# mysql
spring.datasource.test1.jdbc-url=jdbc:mysql://192.168.88.88:3306/test1?useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.test1.username=test1
spring.datasource.test1.password=123456
spring.datasource.test1.driver-class-name=com.mysql.jdbc.Driver

spring.datasource.test2.jdbc-url=jdbc:mysql://192.168.88.88:3306/test2?useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.test2.username=test2
spring.datasource.test2.password=123456
spring.datasource.test2.driver-class-name=com.mysql.jdbc.Driver

第二步、数据源配置

MapperTest1Config

package com.example.framework.config;

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.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.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;

@Configuration
@MapperScan(basePackages = {"com.example.test1.mpr"}, sqlSessionFactoryRef = "test1SqlSessionFactory")
public class MapperTest1Config {
    @Bean(name = "test1DataSource")
    @Primary
    @ConfigurationProperties(prefix = "spring.datasource.test1")
    public DataSource dataSource() {
        return DataSourceBuilder.create().build();
    }

    @Primary
    @Bean(name = "test1TransactionManager")
    public DataSourceTransactionManager transactionManager(@Qualifier("test1DataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Primary
    @Bean(name = "test1SqlSessionFactory")
    public SqlSessionFactory basicSqlSessionFactory(@Qualifier("test1DataSource") DataSource basicDataSource) throws Exception {
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(basicDataSource);
        factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:com/example/test1/mpr/*.xml"));
        return factoryBean.getObject();
    }
}

MapperTest2Config

package com.example.framework.config;

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.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 org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;

@Configuration
@MapperScan(basePackages = {"com.example.test2.mpr"}, sqlSessionFactoryRef = "test2SqlSessionFactory")
public class MapperTest2Config {
    @Bean(name = "test2DataSource")
    @ConfigurationProperties(prefix = "spring.datasource.test2")
    public DataSource dataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "test2TransactionManager")
    public DataSourceTransactionManager transactionManager(@Qualifier("test2DataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "test2SqlSessionFactory")
    public SqlSessionFactory basicSqlSessionFactory(@Qualifier("test2DataSource") DataSource basicDataSource) throws Exception {
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(basicDataSource);
        factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:com/example/test2/mpr/*.xml"));
        return factoryBean.getObject();
    }
}

为了表示区别我两个数据库里创建的两个不同表,即:

test1 中 User表
test2 中 Role表

 

使用方式

使用调用时就和单数据源调用方式一样。需要注意的地方就是如果两个表名和实体名称相似时不能搞错。
    {//对数据源test1插入数据
         UserCreateRequest userCreateRequest = new UserCreateRequest();
         userCreateRequest.setName("AAA");
         userCreateRequest.setType("AAA");
         UserCreateResponse userCreateResponse = userManager.create(userCreateRequest, token);
         System.out.println(MapperUtil.toJson(userCreateResponse));
    }
   {//对数据源test2插入数据
         RoleCreateRequest roleCreateRequest = new RoleCreateRequest();
         roleCreateRequest.setRoleName("BBB");
         RoleCreateResponse roleCreateResponse = roleManager.create(roleCreateRequest, token);
         System.out.println(MapperUtil.toJson(roleCreateResponse));
   }

效果如下:

数据分别插入了各自的数据库下。

 

相关推荐