SpringBoot整合多數(shù)據(jù)源xml方式

項目中遇到需要連接多個數(shù)據(jù)庫,本來使用SpringBoot默認配置連接是非常簡單的,但是由于涉及多個數(shù)據(jù)庫,不得不再自定義配置了,一次性整明白,下次就之間copy使用。

  • 1.首先學(xué)習(xí)一個注解@ConfigurationProperties(prefix = "druid")

默認注入,配置文件中druid開頭的屬性。eg:

druid.url=jdbc:postgresql://139.198.x.x:1x020/account
druid.url2=jdbc:postgresql://139.198.x.x:1x020/oto_saas
druid.driver-class=org.postgresql.Driver
druid.username=root
druid.password=XXX123
druid.initial-size=1
druid.min-idle=1
druid.max-active=20
druid.test-on-borrow=true
druid.timeBetweenEvictionRunsMillis=9000




/**
 *
 * @author liuxin
 * @since 2017/4/19
 */
@ConfigurationProperties(prefix = "druid")
public class DruidProperties {
    private String url;
    private String url2;
    private String username;
    private String password;
    private String driverClass;
    private int maxActive;//最大連接數(shù)
    private int minIdle;//最小連接數(shù)
    private int initialSize;//初始化數(shù)量和
    private boolean testOnBorrow;
    private Long timeBetweenEvictionRunsMillis;//心跳
  • 2.添加數(shù)據(jù)源配置A
    /**
     * @Package: pterosaur.account.config.druid
     * @Description: account 數(shù)據(jù)源1
     * @author: liuxin
     * @date: 17/4/21 下午7:11
     */
    @Configuration
    @EnableConfigurationProperties(DruidProperties.class) //開啟屬性注入,通過@autowired注入 //注入DruidProerties,就是根據(jù)第一個注解,創(chuàng)建的配置類
    @ConditionalOnClass(DruidDataSource.class)//判斷這個類是否在classpath中存在
    @ConditionalOnProperty(prefix = "druid", name = "url")
    @MapperScan(basePackages = "pterosaur.account.mapper.account", sqlSessionTemplateRef  = "accountSqlSessionTemplate")//配置實體類包
    public class DruidAutoConfiguration1 {
        @Autowired
        private DruidProperties properties;
    
        @Bean(name = "accountDataSource") 
        @Primary  //DataSource 是一個接口,因為是兩個數(shù)據(jù)源,所以用Primary標記其中一個,防止報錯
        public DataSource dataSource() {
            DruidDataSource dataSource = new DruidDataSource();
            dataSource.setUrl(properties.getUrl());
            dataSource.setUsername(properties.getUsername());
            dataSource.setPassword(properties.getPassword());
            dataSource.setTimeBetweenEvictionRunsMillis(properties.getTimeBetweenEvictionRunsMillis());
            if (properties.getInitialSize() > 0) {
                dataSource.setInitialSize(properties.getInitialSize());
            }
            if (properties.getMinIdle() > 0) {
                dataSource.setMinIdle(properties.getMinIdle());
            }
            if (properties.getMaxActive() > 0) {
                dataSource.setMaxActive(properties.getMaxActive());
            }
            dataSource.setTestOnBorrow(properties.isTestOnBorrow());
            try {
                dataSource.init();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
            return dataSource;
        }
    
    
        @Bean(name = "accountSqlSessionFactory")
        @Primary //同上
        public SqlSessionFactory testSqlSessionFactory(@Qualifier("accountDataSource") DataSource dataSource) throws Exception {
            SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
            bean.setDataSource(dataSource);
            bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/account/*.xml"));
            return bean.getObject(); //配置映射文件地址
        }
    
        @Bean(name = "accountTransactionManager")
        @Primary
        public DataSourceTransactionManager testTransactionManager(@Qualifier("accountDataSource") DataSource dataSource) {
            return new DataSourceTransactionManager(dataSource);
        }
    
        @Bean(name = "accountSqlSessionTemplate")
        @Primary
        public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("accountSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
            return new SqlSessionTemplate(sqlSessionFactory);
        }
    }
  • 3.添加數(shù)據(jù)源配置B
    package pterosaur.account.config.druid;
    
    import com.alibaba.druid.pool.DruidDataSource;
    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.boot.autoconfigure.AutoConfigureBefore;
    import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
    import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
    import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.boot.context.properties.EnableConfigurationProperties;
    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;
    import java.sql.SQLException;
    
    /**
     * @Package: pterosaur.account.config.druid
     * @Description: otosaas 數(shù)據(jù)源2
     * @author: liuxin
     * @date: 17/4/21 下午7:11
     */
    @Configuration
    @EnableConfigurationProperties(DruidProperties.class)
    @ConditionalOnClass(DruidDataSource.class)
    @ConditionalOnProperty(prefix = "druid", name = "url")
    @MapperScan(basePackages = "pterosaur.account.mapper.otosaas", sqlSessionTemplateRef  = "otoSaaSSqlSessionTemplate")
    public class DruidAutoConfiguration2 {
        @Autowired
        private DruidProperties properties;
    
        @Bean(name = "otoSaaSDataSource")
        public DataSource dataSource() {
            DruidDataSource dataSource = new DruidDataSource();
            dataSource.setUrl(properties.getUrl2());
            dataSource.setUsername(properties.getUsername());
            dataSource.setPassword(properties.getPassword());
            dataSource.setTimeBetweenEvictionRunsMillis(properties.getTimeBetweenEvictionRunsMillis());
            if (properties.getInitialSize() > 0) {
                dataSource.setInitialSize(properties.getInitialSize());
            }
            if (properties.getMinIdle() > 0) {
                dataSource.setMinIdle(properties.getMinIdle());
            }
            if (properties.getMaxActive() > 0) {
                dataSource.setMaxActive(properties.getMaxActive());
            }
            dataSource.setTestOnBorrow(properties.isTestOnBorrow());
            try {
                dataSource.init();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
            return dataSource;
        }
    
    
        @Bean(name = "otoSaaSSqlSessionFactory")
        public SqlSessionFactory testSqlSessionFactory(@Qualifier("otoSaaSDataSource") DataSource dataSource) throws Exception {
            SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
            bean.setDataSource(dataSource);
            bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/otosaas/*.xml"));
            return bean.getObject();
        }
    
        @Bean(name = "accountTransactionManager")
        public DataSourceTransactionManager testTransactionManager(@Qualifier("otoSaaSDataSource") DataSource dataSource) {
            return new DataSourceTransactionManager(dataSource);
        }
    
        @Bean(name = "otoSaaSSqlSessionTemplate")
        public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("otoSaaSSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
            return new SqlSessionTemplate(sqlSessionFactory);
        }
    }
    

參考地址
代碼地址

@ConditionalOnBean(僅僅在當(dāng)前上下文中存在某個對象時,才會實例化一個Bean)
@ConditionalOnClass(某個class位于類路徑上,才會實例化一個Bean)
@ConditionalOnExpression(當(dāng)表達式為true的時候,才會實例化一個Bean)
@ConditionalOnMissingBean(僅僅在當(dāng)前上下文中不存在某個對象時,才會實例化一個Bean)
@ConditionalOnMissingClass(某個class類路徑上不存在的時候,才會實例化一個Bean)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,569評論 19 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,275評論 6 342
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,728評論 18 399
  • 文章作者:Tyan博客:noahsnail.com 3.4 Dependencies A typical ente...
    SnailTyan閱讀 4,493評論 2 7
  • 昨晚和表哥一起到外婆家吃飯,老人家?guī)讉€月未見,一看到我們回來就廚房客廳忙里忙外。我給她買了件羊毛衫,穿著合身,她高...
    卷毛維安閱讀 7,005評論 41 252

友情鏈接更多精彩內(nèi)容