Spring boot mybatis 配置动态多数据库

  • Post author:
  • Post category:其他

新项目用到spring boot框架,在链接多数据源时,如何配置动态数据库?看了一圈,网上有很多种方式,如xml配置sqlSessionFactory。或者通过AOP切面的方式,后来想想,总感觉这种方式比较繁琐,后台看到一个想法,通过文件所属目录来区分数据库,我觉得挺好的。

一、SpringBootApplication配置

首先要将spring boot自带的DataSourceAutoConfiguration禁掉,因为它会读取application.properties文件的spring.datasource.*属性并自动配置单数据源。在@SpringBootApplication注解中添加exclude属性即可:

@EnableFeignClients
@Import(BecloudAutoConfigServiceWrapper.class)
@SpringBootApplication(exclude = {
        DataSourceAutoConfiguration.class})

public class BecloudServicePaymentApplication {

	public static void main(String[] args) {
		SpringApplication.run(BecloudServicePaymentApplication.class, args);
	}
}

二、首先是application.properties配置(路径:resources/application.properties

# MysqlSQL database -- auth
spring.datasource.auth.url=jdbc:mysql://ip:3306/auth?useSSL=false&useUnicode=true&characterEncoding=utf8&autoReconnect=true
spring.datasource.auth.username=username
spring.datasource.auth.password=password
spring.datasource.auth.driver-class-name=com.mysql.jdbc.Driver

# PostgreSQL database -- mbox
spring.datasource.mbox.url=jdbc:postgresql://ip:port/mbox?charSet=utf-8
spring.datasource.mbox.username=username
spring.datasource.mbox.password=password
spring.datasource.mbox.driver-class-name=org.postgresql.Driver

# PostgreSQL database -- risk
spring.datasource.risk.url=jdbc:postgresql://ip:port/risk?charSet=utf-8
spring.datasource.risk.username=username
spring.datasource.risk.password=password
spring.datasource.mbox.driver-class-name=org.postgresql.Driver

三、项目目录结构

四、设置DataSourceConfig.java

import javax.sql.DataSource;

import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

@Configuration
public class DataSourceConfig {
	@Bean(name = "authMasterDS")
	@Primary //主数据库
    @ConfigurationProperties(prefix = "spring.datasource.auth") // application.properteis中对应属性的前缀
    public DataSource dataSource1() {
        return DataSourceBuilder.create().build();
    }
	
	@Bean(name = "mboxMasterDS")
    @ConfigurationProperties(prefix = "spring.datasource.mbox") // application.properteis中对应属性的前缀
    public DataSource dataSource2() {
        return DataSourceBuilder.create().build();
    }
	
	@Bean(name = "riskMasterDS")
    @ConfigurationProperties(prefix = "spring.datasource.risk") // application.properteis中对应属性的前缀
    public DataSource dataSource3() {
        return DataSourceBuilder.create().build();
    }
	
}

五、配置SqlSessionFactory

    5.1、

MybatisAuthConfig.java

import javax.sql.DataSource;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

@Configuration
@MapperScan(basePackages = {"com.becloud.service.payment.mapper.auth","evo.cloud.auths.dao"}, sqlSessionFactoryRef = "sqlSessionFactory1")//根据basePackages目录来区分数据库,访问该目录下的mapper文件,则链接该数据库
public class MybatisAuthConfig {
	@Autowired
	@Qualifier("authMasterDS")
    private DataSource auth;
	
	@Bean
    public SqlSessionFactory sqlSessionFactory1() throws Exception {
		System.out.println("=====================================================================");
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(auth); // 使用auth数据源, 连接auth库
        //扫描对应的mapper文件
        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
           factoryBean.setMapperLocations(resolver.getResources("classpath*:mapper/auth/*Mapper.xml"));//resources/mapper目录最好和src/main/java下面的mapper目录保持一致,用来注入xml文件
        return factoryBean.getObject();
    }
	
	@Bean
    public SqlSessionTemplate sqlSessionTemplate1() throws Exception {
        SqlSessionTemplate template = new SqlSessionTemplate(sqlSessionFactory1()); // 使用上面配置的Factory
        return template;
    }
}

 5.2、MybatisMboxConfig


import javax.sql.DataSource;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

@Configuration
@MapperScan(basePackages = {"com.becloud.service.payment.mapper.mbox"}, sqlSessionFactoryRef = "sqlSessionFactory2")
public class MybatisMboxConfig {
	@Autowired
    @Qualifier("mboxMasterDS")
    private DataSource mbox;
	
	@Bean
    public SqlSessionFactory sqlSessionFactory2() throws Exception {
		System.out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++");
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(mbox); // 使用mbox数据源, 连接mbox库

        //扫描对应的mapper文件
      //  factoryBean.setMapperLocations(new Resource[]{new ClassPathResource("mapper/mbox/PayProdMapper.xml")});
        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        factoryBean.setMapperLocations(resolver.getResources("classpath*:mapper/mbox/*Mapper.xml"));
        return factoryBean.getObject();
    }
	
	@Bean
    public SqlSessionTemplate sqlSessionTemplate2() throws Exception {
        SqlSessionTemplate template = new SqlSessionTemplate(sqlSessionFactory2()); // 使用上面配置的Factory
        return template;
    }
}

 5.3、配置MybatisRiskConfig.java

import javax.sql.DataSource;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

@Configuration
@MapperScan(basePackages = {"com.becloud.service.payment.mapper.risk"}, sqlSessionFactoryRef = "sqlSessionFactory3")
public class MybatisRiskConfig {
	@Autowired
	@Qualifier("riskMasterDS")
    private DataSource risk;
	
	@Bean
    public SqlSessionFactory sqlSessionFactory3() throws Exception {
		System.out.println("=====================================================================");
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(risk); // 使用risk数据源, 连接risk库
        //扫描对应的mapper文件
        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        factoryBean.setMapperLocations(resolver.getResources("classpath*:mapper/risk/*Mapper.xml"));
        return factoryBean.getObject();
    }
	
	@Bean
    public SqlSessionTemplate sqlSessionTemplate3() throws Exception {
        SqlSessionTemplate template = new SqlSessionTemplate(sqlSessionFactory3()); // 使用上面配置的Factory
        return template;
    }
}

然后启动项目:

如果访问“com.becloud.service.payment.mapper.auth”或者“evo.cloud.auths.dao”路径下j的mapper类则表示访问的是
auth数据库。

若访问的是“com.becloud.service.payment.mapper.mbox”路径下j的mapper类则表示访问的是mbox数据库。


版权声明:本文为Tastill原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。