Spring Boot整合MyBatis多數據源


Spring Boot整合MyBatis多數據源

在一些復雜的應用開發中,一個應用可能會涉及到連接多個數據源,所謂多數據源這里就定義為至少連接兩個及以上的數據庫了。

首先創建Spring Boot工程

添加MyBatis、Druid依賴(這里的Druid必須是專為Spring boot打造的Druid,不能使用傳統的Druid)、MySQL以及Web依賴,完整的依賴如下:

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.0</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <!--注意配置版本號-->
            <version>5.1.28</version>
     https://i.cnblogs.com/EditCategories.aspx?catid=1       <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!--druid連接池-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.10</version>
        </dependency>
    </dependencies>

多數據源配置

接下來配置多數據源,在application.properties中配置數據庫基本信息,然后提供兩個DataSource即可,下面是簡單的application.properties中的配置:

spring.datasource.one.url=jdbc:mysql://localhost:3306/test01?useUnicode=true&characterEncoding=utf-8
spring.datasource.one.username=root
spring.datasource.one.password=123456
spring.datasource.one.type=com.alibaba.druid.pool.DruidDataSource

spring.datasource.two.url=jdbc:mysql://localhost:3306/test02?useUnicode=true&characterEncoding=utf-8
spring.datasource.two.username=root
spring.datasource.two.password=123456
spring.datasource.two.type=com.alibaba.druid.pool.DruidDataSource

然后創建DataSourceConfig 配置類,里面配置對應的兩個數據源:

@Configuration
public class DataSourceConfig {
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.one")
    DruidDataSource dsOne() {
        return DruidDataSourceBuilder.create().build();
    }

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.two")
    DruidDataSource dsTwo() {
        return DruidDataSourceBuilder.create().build();
    }
}

MyBatis配置

這里需要配置兩個Bean,所以兩個數據源分兩個類配置:

@Configuration//聲明該類是一個配置類
@MapperScan(basePackages = "com.lwh.mybatistest.mapper", sqlSessionFactoryRef = "sqlSessionFactory1", sqlSessionTemplateRef = "sqlSessionTemplate1")
//掃描的包是com.lwh.mybatistest.mapper
//SqlSessionFactory根據dsOne創建,然后再根據創建好的SqlSessionFactory創建一個SqlSessionTemplate。
public class MyBatisConfigOne {
    @Resource(name = "dsOne")
    DataSource dsOne;

    @Bean
    SqlSessionFactory sqlSessionFactory1() {
        SqlSessionFactory sessionFactory = null;
        try {
            SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
            bean.setDataSource(dsOne);
            sessionFactory = bean.getObject();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return sessionFactory;
    }

    @Bean
    SqlSessionTemplate sqlSessionTemplate1() {
        return new SqlSessionTemplate(sqlSessionFactory1());
    }
}

依照第一個配置,配置第二個數據源即可,這里需要注意因為操作的是不同的數據源,所以掃描的包是不一樣的,不同的Mapper將操作不同的數據源。如下:

@Configuration//聲明該類是一個配置類
@MapperScan(basePackages = "com.lwh.mybatistest.mapper2", sqlSessionFactoryRef = "sqlSessionFactory2", sqlSessionTemplateRef = "sqlSessionTemplate2")
public class MyBatisConfigTwo {
    @Resource(name = "dsTwo")
    DataSource dsTwo;

    @Bean
    SqlSessionFactory sqlSessionFactory2() {
        SqlSessionFactory sessionFactory = null;
        try {
            SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
            bean.setDataSource(dsTwo);
            sessionFactory = bean.getObject();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return sessionFactory;
    }

    @Bean
    SqlSessionTemplate sqlSessionTemplate2() {
        return new SqlSessionTemplate(sqlSessionFactory2());
    }
}

項目結構如下:

上面的mapper.xml文件是用MyBatis逆向工程生成的,這里不再贅述。
在Maven項目中,官方建議我們把XML文件放在resources文件下,如果放在java下面,項目打包的時候會自動的過濾掉,所以我們在Maven的配置文件中,讓項目不要過濾我們的XML文件,因此我們需要在pom.xml配置文件中的 bulid 節點里面添加配置信息,如下:

<build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
            </resource>
        </resources>
</build>

這樣項目在打包發布的時候,就不會過濾掉我們的mapper.xml文件了

數據庫one的數據為:

數據庫two的數據為:

現在去測試類測試我們的配置是否成功:

@RunWith(SpringRunner.class)
@SpringBootTest
public class MybatistestApplicationTests {

    @Autowired
    BookMapper bookMapper;
    @Autowired
    BookMapper2 bookMapper2;
    @Test
    public void contextLoads() {
        List<Book> list = bookMapper.getAllBook();
        System.out.println("第一個:" + list);
        System.out.println("第二個:" + bookMapper2.getAllBook());

    }

}

輸出結果為:

第一個:[Book{id=1, bookname='三國演義', author='羅貫中'}]
第二個:[Book{id=2, bookname='紅樓夢', author='曹雪芹'}]

因此我們的項目多數據源的操作就配置成功了!

總結:

1,首先給Spring Boot項目引入相關的依賴。
2,在application.properties中配置多個數據庫相關信息,創建DataSource配置類。
3,分別給不同的數據庫配置對應的Mybatis配置類,不同的mapper操作對應的數據庫。

以上配置教程參考江南一點雨的博客。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM