springboot mybatis多數(shù)據(jù)源配置

最近由于項目中需要同時連接兩個數(shù)據(jù)庫,所以需要配置多個數(shù)據(jù)源,由于springboot 默認(rèn)幫我們做了很多自動配置,所以在配置的時候就遇到了問,稍后我們會討論這個問題。

項目依賴

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>4.3.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <version>1.5.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>6.0.5</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.12</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.1.1</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
            <version>1.5.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.0.29</version>
        </dependency>

數(shù)據(jù)庫不同源配置文件

master連接的是test庫,slave連接的是haozi,這里的命名并沒有主從關(guān)系,只是為了區(qū)分

datasource.master.url=jdbc:mysql://127.0.0.1:3306/test
datasource.master.driverClassName=com.mysql.jdbc.Driver
datasource.master.username=root
datasource.master.password=


datasource.slave.url=jdbc:mysql://127.0.0.1:3306/haozi
datasource.slave.driverClassName=com.mysql.jdbc.Driver
datasource.slave.username=root
datasource.slave.password=

Master Mybatis配置

@Configuration
@MapperScan(basePackages = "com.example.mapper.master",sqlSessionFactoryRef = "masterSqlSessionFactory")
public class MasterDataSourceConfig {

    @Bean(name = "masterDataSource")
    @ConfigurationProperties("datasource.master")
    public DataSource masterDataSource(){
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "masterSqlSessionFactory")
    public SqlSessionFactory sqlSessionFactory(@Qualifier("masterDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
        sessionFactoryBean.setDataSource(dataSource);
        sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
        .getResources("classpath*:mapper/master/*.xml"));
        return sessionFactoryBean.getObject();
    }

}

Slave Mybatis配置

@Configuration
@MapperScan(basePackages = "com.example.mapper.slave",sqlSessionFactoryRef = "slaveSqlSessionFactory")
public class SlaveSourceConfig {
    @Bean(name = "slaveDataSource")
    @ConfigurationProperties("datasource.slave")
    public DataSource slaveDataSource(){
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "slaveSqlSessionFactory")
    public SqlSessionFactory sqlSessionFactory(@Qualifier("slaveDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
        sessionFactoryBean.setDataSource(dataSource);
        sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources("classpath*:mapper/slave/*.xml"));
        return sessionFactoryBean.getObject();
    }
}

結(jié)構(gòu)圖及對應(yīng)關(guān)系分析

structure1.png

這里的mapper目錄下的master和slave主要存放的是mapper接口,被上面的DataSourceConfig上的@MapperScan注解所燒面,這里面我把master和slave的mapper接口放在不同的子目錄下了。

structure1.png

這里分別放的是和上面mapper接口對應(yīng)的.xml文件,被上面的配置來掃描,然后通過setMapperLocations注冊到SqlSessionFactory中。

可能遇到的問題

  • mybatis required a single bean, but 2 were found
    這是因我們這里配置了兩個數(shù)據(jù)源,springboot會自動的注入,但是注入的時候發(fā)現(xiàn)有兩個,所以不知道選擇哪一個了,因為我們要關(guān)閉springboot關(guān)于mybatis的一些自動注入,在@SpringBootApplication注解下面,加入一個@EnableAutoConfiguration(exclude=""),具體如下:
@SpringBootApplication
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class,DataSourceTransactionManagerAutoConfiguration.class, MybatisAutoConfiguration.class})

第一個是數(shù)據(jù)源,第二個是數(shù)據(jù)源的事務(wù)管理器,第三個是和SessionFactory相關(guān)的。

最后編輯于
?著作權(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)容

  • 現(xiàn)在一般的應(yīng)用都會有多個數(shù)據(jù)源.SpringBoot結(jié)合Mybatis的使用可以大大方便開發(fā)者對SQL的開發(fā).所以...
    StephenZ閱讀 3,413評論 0 5
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,544評論 19 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,265評論 6 342
  • 前言 最近做回后臺開發(fā),重新抓起以前學(xué)過的SSM(Spring+Spring MVC+Mybatis),但是發(fā)現(xiàn)配...
    Raye閱讀 6,637評論 15 79
  • 寫給2017年的小倪小姐美麗的小倪小姐:你好!我是你兒子的姑姑,很高興認(rèn)識你。我是記得你的生日的,不許再吐槽我了。...
    力小妞閱讀 1,447評論 0 0

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