springboot配置多數據源,不同業務讀取不同的數據源,親測有效

先看一下目錄結構。

網上配置的多數據源有很多,但一定要配置適合自己的,中間很多坑,後邊會一一標出來。

目的就是項目中不同的業務去讀取不同的數據庫,目錄結構配置如上。

直接上代碼

配置springboot的配置文件,配置好的配置文件

配置兩個data類

DataSource1 類

package com.honghe.operations.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.Qualifier;
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;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.jdbc.datasource.DriverManagerDataSource;

import javax.sql.DataSource;

//註解到spring容器中
@Configuration
//@MapperScan(basePackages = "com.honghe.operations.db.mapper.data1",sqlSessionFactoryRef = "data1SqlSessionFactory")
@MapperScan(basePackages = "com.honghe.operations.db.dao.centerservice.data1",sqlSessionFactoryRef = "data1SqlSessionFactory")
public class DataSource1 {

    /**
     * 返回data1數據庫的數據源
     * @return
     */
    @Bean(name="data1Source")
    //主數據源
    @Primary
    @ConfigurationProperties(prefix = "com.honghe.operations.datasource.DataSource1")
    public DataSource dataSource(){
//        return DataSourceBuilder.create().build();
        DriverManagerDataSource ret = new DriverManagerDataSource();
        ret.setDriverClassName("com.mysql.jdbc.Driver");
        ret.setUsername("root");
        ret.setPassword("bhjRjxwC8EBqaJC7");
        ret.setUrl("jdbc:mysql://localhost:3306/hht_dmanager?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull");
        return ret;

    }

    /**
     * 返回data1數據庫的會話工廠
     * @param ds
     * @return
     * @throws Exception
     */
    @Bean(name = "data1SqlSessionFactory")
    @Primary
    public SqlSessionFactory sqlSessionFactory(@Qualifier("data1Source") DataSource ds) throws Exception{
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(ds);
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:com/honghe/operations/db/mapper/centerservice/data1/*.xml"));
        return bean.getObject();
    }

    /**
     * 返回data1數據庫的會話模板
     * @param sessionFactory
     * @return
     * @throws Exception
     */
    @Bean(name = "data1SqlSessionTemplate")
    @Primary
    public SqlSessionTemplate sqlSessionTemplate(@Qualifier("data1SqlSessionFactory") SqlSessionFactory sessionFactory) throws  Exception{
        return  new SqlSessionTemplate(sessionFactory);
    }

    /**
     * 返回data1數據庫的事務
     * @param ds
     * @return
     */
    @Bean(name = "data1TransactionManager")
    @Primary
    public DataSourceTransactionManager transactionManager(@Qualifier("data1Source") DataSource ds){
        return new DataSourceTransactionManager(ds);
    }
}

踩坑:

這三個地方小心配置,配置自己項目dao和mapper的路徑,我已經踩過坑。

 

DataSource2
package com.honghe.operations.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.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
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 org.springframework.jdbc.datasource.DriverManagerDataSource;

import javax.sql.DataSource;

@Configuration//註解到spring容器中
@MapperScan(basePackages = "com.honghe.operations.db.dao.centerservice.data2", sqlSessionFactoryRef = "data2SqlSessionFactory")
public class DataSource2 {

    /**
     * 返回data2數據庫的數據源
     *
     * @return
     */
    @Bean(name = "data2Source")
    @ConfigurationProperties(prefix = "com.honghe.operations.datasource.DataSource2")
    public DataSource dataSource() {
//        return DataSourceBuilder.create().build();
        DriverManagerDataSource ret = new DriverManagerDataSource();
        ret.setDriverClassName("com.mysql.jdbc.Driver");
        ret.setUsername("root");
        ret.setPassword("bhjRjxwC8EBqaJC7");
        ret.setUrl("jdbc:mysql://localhost:3306/hht_device_operation?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull");
        return ret;
    }

    /**
     * 返回data2數據庫的會話工廠
     *
     * @param ds
     * @return
     * @throws Exception
     */
    @Bean(name = "data2SqlSessionFactory")
    public SqlSessionFactory sqlSessionFactory(@Qualifier("data2Source") DataSource ds) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(ds);
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:com/honghe/operations/db/mapper/centerservice/data2/*.xml"));
        return bean.getObject();
    }

    /**
     * 返回data2數據庫的會話模板
     *
     * @param sessionFactory
     * @return
     * @throws Exception
     */
    @Bean(name = "data2SqlSessionTemplate")
    public SqlSessionTemplate sqlSessionTemplate(@Qualifier("data2SqlSessionFactory") SqlSessionFactory sessionFactory) throws Exception {
        return new SqlSessionTemplate(sessionFactory);
    }

    /**
     * 返回data2數據庫的事務
     *
     * @param ds
     * @return
     */
    @Bean(name = "data2TransactionManager")
    public DataSourceTransactionManager transactionManager(@Qualifier("data2Source") DataSource ds) {
        return new DataSourceTransactionManager(ds);
    }
}

至此,配置完成。雖然只有配置文件和配置類需要配置。但是其中一定要搞明白自己項目db層的路徑,否則就會報各種找不到文件的錯,共勉

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章