1. 程式人生 > >Spring Boot 整合mybatis 如何使用多資料來源

Spring Boot 整合mybatis 如何使用多資料來源

前言

    本篇教程偏向實戰,程式猿直接copy程式碼加入到自己的專案中做簡單的修修改改便可使用,而對於springboot以及mybatis不在此進行展開介紹,如有讀者希望瞭解可以給我留言,並持續關注,我後續會慢慢更新。(黑色區域程式碼部分,安卓手機可手動向左滑動,來檢視全部程式碼)

整合

    其實整合很簡單,如果是用gradle的話,在build.gradle檔案里加入    

compile('org.mybatis.spring.boot:mybatis-spring-boot-starter:1.3.1')

如果是用maven的話在pom.xml檔案里加入

<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.1</version>
</dependency>
單庫配置:

 引入之後,預設情況下,Spring Boot會自動為我們配置好一個DataSource,它會在classpath中搜索H2、hsqldb等記憶體資料庫的jar包,如果找到了,就會自動配置一個記憶體資料庫的DataSource。

如果在application.yml或application.property中指定了spring.datasource.*的相關配置引數,Spring Boot就會使用該配置建立一個DataSource。

然後會自動建立使用該DataSource的SqlSessionFactoryBean以及SqlSessionTemplate。會自動掃描你的Mappers,連線到SqlSessionTemplate,並註冊到Spring上下文中。

spring.datasource.url=jdbc:mysql://localhost/test
spring.datasource.username=dbuser
spring.datasource.password=dbpass
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

更多引數請檢視DataSourceProperties

多庫配置:

    由於業務需要,專案要同時使用多個數據庫進行業務開發:

首先,我們必須在application.property中自定義兩個資料來源的配置,一個使用first.datasource.*,另一個使用second.datasource.*,為了能使別人一眼看出連線的是什麼庫,可以使用資料庫命名,比如user庫,則可以使用user.datasource.*,在使用多資料來源的時候,所有必要配置都不能省略。

first.datasource.url=jdbc:mysql://localhost/first
first.datasource.username=dbuser1
first.datasource.password=dbpass1
first.datasource.driver-class-name=com.mysql.jdbc.Driver
first.datasource.type=com.alibaba.druid.pool.DruidDataSource//我用的是Druid,也可以不加用預設的

second.datasource.url=jdbc:mysql://localhost/second
second.datasource.username=dbuser2
second.datasource.password=dbpass2
second.datasource.driver-class-name=com.mysql.jdbc.Driver
second.datasource.type=com.alibaba.druid.pool.DruidDataSource

直接上程式碼,我的做法是將兩個資料來源用兩個配置類建立:

@Configuration
@MapperScan(basePackages = {"com.user.server.dao"}, sqlSessionTemplateRef = "userSqlSessionTemplate")
public class UserMybatisConfig {
    @Bean(name = "userDataSource")
    @Primary //必須加此註解,不然報錯,下一個類則不需要新增
    @ConfigurationProperties(prefix = "first.datasource") // prefix值必須是application.properteis中對應屬性的字首
    public DataSource userDataSource() {
        return DataSourceBuilder.create().build();
    }
    
    @Bean
    public SqlSessionFactory userSqlSessionFactory(@Qualifier("userDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource); 
        //新增XML目錄
        ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        try {
            bean.setMapperLocations(resolver.getResources("classpath*:com/user/server/dao/mapping/*.xml"));
            return bean.getObject();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
    
    @Bean
    public SqlSessionTemplate userSqlSessionTemplate(@Qualifier("userSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        SqlSessionTemplate template = new SqlSessionTemplate(sqlSessionFactory); // 使用上面配置的Factory
        return template;
    }
}
@Configuration
@MapperScan(basePackages = {"com.airmi.server.dao"}, sqlSessionTemplateRef = "autoTestSqlSessionTemplate")
public class AutoTestMybatisConfig {

    @Bean
    @ConfigurationProperties(prefix = "autotest.datasource") 
    public DataSource autoTestDataSource() {
        return DataSourceBuilder.create().build();
    }
    @Bean
    public SqlSessionTemplate autoTestSqlSessionTemplate(@Qualifier("autoTestSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        SqlSessionTemplate template = new SqlSessionTemplate(sqlSessionFactory);
        return template;
    }

    @Bean
    public SqlSessionFactory autoTestSqlSessionFactory(@Qualifier("autoTestDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource); 

        //新增XML目錄
        ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        try {
            bean.setMapperLocations(resolver.getResources("classpath*:com/airmi/server/dao/mapping/*.xml"));
            return bean.getObject();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
}

@Primary //該註解表示在同一個介面有多個實現類可以注入的時候,預設選擇哪一個,而不是讓autowire註解報錯,官網要求當多個數據源時,必須指定一個datasource,另一個datasource則不用新增。

@Qualifier 根據名稱進行注入,通常是在具有相同的多個型別的例項的一個注入(例如有多個DataSource型別的例項)。

@MapperScan(basePackages = {"com.user.server.dao"}, sqlSessionTemplateRef = "userSqlSessionTemplate") basePackages為mapper所在的包,sqlSessionTemplateRef要引用的例項。

user程式碼結構如下:


相關閱讀:

推薦閱讀:

學習分享:


知識分享:現在是資源共享的時代,同樣也是知識分享的時代,如果你覺得本文能學到知識,請把知識與別人分享

一碼不掃, 何以掃天下?

長按關注我們