spring boot 链接两个数据源,操作两个数据库(可以多个)

  • Post author:
  • Post category:其他



readme:

本文实现在同一个springboot服务上配置两个数据库源,如果想要添加更多数据库源,或者不同服务器的数据库源均可,文中会提示如何操作。



1.数据源配置文件:

数据源配置文件内容如下:

spring:
	datasource:
	    aaa:
	      driver-class-name: com.mysql.jdbc.Driver
	      jdbc-url: jdbc:mysql://localhost:3306/db_aa?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false
	      username: root
	      password: ***
	    bbb:
	      driver-class-name: com.mysql.jdbc.Driver
	      jdbc-url: jdbc:mysql://localhost:3306/db_bb?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false
	      username: root
	      password: ***

如果按树结构去写配置文件,一定要注意缩进以及表达的含义。



2.修改springboot服务启动文件:PreprocessServiceApplication.java

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class})
@SpringBootApplication()
@EnableDiscoveryClient
@EnableEurekaClient
public class PreprocessServiceApplication {

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

@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class})意为:去掉springboot服务启动时对于数据源配置的自动导入。后面我们会手动配置多个数据源。

如果有需要,也可把事务管理与mybatis的自动导入去掉,注解为:

@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class,DataSourceTransactionManagerAutoConfiguration.class, MybatisAutoConfiguration.class})



3.配置两个数据源(也可多个)


注:以下三个文件都在config包下


DataSourceConfig.java

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 javax.sql.DataSource;

@Configuration
public class DataSourceConfig {
    @Primary
    @Bean(name = "aaa")
    @ConfigurationProperties(prefix = "spring.datasource.aaa")
    public DataSource dataSourcePreprocess() {
        return DataSourceBuilder.create().build();
    }

    @Primary
    @Bean(name = "bbb")
    @ConfigurationProperties(prefix = "spring.datasource.bbb")
    public DataSource dataSourceSentence() {
        return DataSourceBuilder.create().build();
    }

	//如果有更多的数据源需要,在此添加相关的bean,注意bean属性name,@ConfigurationProperties为配置文件配置数据源的前缀
	//有一个bean就要对于在config文件夹创建对应的xxxConfig.java文件生成工厂
}

aaaConfig.java

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.context.annotation.Primary;

import javax.sql.DataSource;

@Configuration
@MapperScan(basePackages = {"com.dao.aaa"}, sqlSessionFactoryRef = "sqlSessionFactory1")
public class MybatisPreprocessConfig {
    @Autowired
    @Qualifier("aaa")
    private DataSource ds1;

    @Bean(name = "sqlSessionFactory1")
    @Primary
    public SqlSessionFactory sqlSessionFactory1() throws Exception {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(ds1);
        return sqlSessionFactoryBean.getObject();
    }

    @Bean
    @Primary
    public SqlSessionTemplate sqlSessionTemplate1() throws Exception {
        SqlSessionTemplate sqlSessionTemplate = new SqlSessionTemplate(sqlSessionFactory1());
        return sqlSessionTemplate;
    }
}

bbbConfig.java

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.context.annotation.Primary;

import javax.sql.DataSource;

@Configuration
@MapperScan(basePackages = {"com.dao.bbb"}, sqlSessionFactoryRef = "sqlSessionFactory2")
public class MybatisSentenceConfig {
    @Autowired
    @Qualifier("bbb")
    private DataSource ds2;

    @Bean(name = "sqlSessionFactory2")
    @Primary
    public SqlSessionFactory sqlSessionFactory2() throws Exception {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(ds2);
        return sqlSessionFactoryBean.getObject();
    }

    @Bean
    @Primary
    public SqlSessionTemplate sqlSessionTemplate2() throws Exception {
        SqlSessionTemplate sqlSessionTemplate = new SqlSessionTemplate(sqlSessionFactory2());
        return sqlSessionTemplate;
    }
}



4.dao包结构如下:

dao
	aaa
		xxxdao.java
	bbb
		yyydao.java
	ccc
		zzzdao.java


一定注意!!一个数据源对应dao下面的一个子包!



5.运行测试

自己测。。

参考链接:


https://blog.csdn.net/mengda_lei/article/details/81484355



https://blog.csdn.net/weixin_40085570/article/details/80968099



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