spring-boot +mybatis 配置多數據源

spring-boot +mybatis 配置多數據源

在開發中,有時候咱們的數據庫是作了讀寫分庫的處理的。那麼在開發使用的時候須要讀取不一樣來源的數據庫,咱們須要配置spring-boot mybatis進行多數據源處理。html

須要的四個類

四個類

DatabaseContextHolder:在dao層或service層用來選擇使用那個數據源。java

DateBaseType:枚舉類,枚舉全部的數據源名。spring

DynamicDataSource:繼承AbstractRoutingDataSource,實現方法
determineCurrentLookupKey 獲取當前線程的數據源。sql

MybatisConfig:設置數據源,涉及DataSource,DynamicDataSource,sqlSessionFactory數據庫

DataSource(接口):數據源的對象化,驅動,鏈接地址,用戶名,密碼是他的屬性,咱們使用的是的是alibaba提供的Druid。tomcat

sqlSessionFactory:工廠模式建立sqlSession(能夠理解爲jdbc裏的connection)安全

DateBaseType

/**
 * 列出全部的數據源key(經常使用數據庫名稱來命名)
 * 注意:
 * 1)這裏數據源與數據庫是一對一的
 * 2)DatabaseType中的變量名稱就是數據庫的名稱
 * @Author xuelongjiang
 */
public enum DatabaseType {

    main,yuntu
}

DatabaseContextHolder

/**
 * 保存一個線程安全的DatabaseType容器
 * @Author xuelongjiang
 */
public class DatabaseContextHolder {

    private static final  ThreadLocal<DatabaseType> contextHolder = new ThreadLocal<>();

    public static void setDatabaseType(DatabaseType type){
            contextHolder.set(type);
    }

    public static  DatabaseType getDatabaseType(){
        return contextHolder.get();
    }

}

DynamicDataSource

/**
 * 動態數據源(須要繼承AbstractRoutingDataSource)
 * @Author xuelongjiang
 */
public class DynamicDataSource  extends AbstractRoutingDataSource{

    @Nullable
    @Override
    protected Object determineCurrentLookupKey() {
        return DatabaseContextHolder.getDatabaseType();
    }


}

MybatisConfig

/**
 * springboot集成mybatis的基本入口 1)建立數據源(若是採用的是默認的    tomcat-jdbc數據源,則不須要)
 * 2)建立SqlSessionFactory 3)配置事務管理器,除非須要使用事務,不然不    用配置
 * @Author xuelongjiang
 */
@Configuration // 該註解相似於spring配置文件
@ComponentScan(basePackages = "fm.xiaoai.wxmanager.dao")
public class MyBatisConfig {

    @Autowired
    private Environment environment;


    /**
     * 建立數據源(數據源的名稱:方法名能夠取爲XXXDataSource(),XXX爲數據    庫名稱,該名稱也就是數據源的名稱)
    */
    @Bean
    public DataSource mainDataSource() throws Exception {
        Properties props = new Properties();
        props.put("driverClassName", environment.getProperty("main-datasource.driverClassName"));
        props.put("url", environment.getProperty("main-datasource.url"));
        props.put("username", environment.getProperty("main-datasource.username"));
        props.put("password", environment.getProperty("main-datasource.password"));
        return DruidDataSourceFactory.createDataSource(props);
}

    @Bean
    public DataSource yuntuDataSource() throws Exception {
        Properties props = new Properties();
        props.put("driverClassName", environment.getProperty("yuntu-datasource.driverClassName"));
        props.put("url", environment.getProperty("yuntu-datasource.url"));
        props.put("username", environment.getProperty("yuntu-datasource.username"));
        props.put("password", environment.getProperty("yuntu-datasource.password"));
        return DruidDataSourceFactory.createDataSource(props);
}


    /**
     * @Primary 該註解表示在同一個接口有多個實現類能夠注入的時候,默認選擇        哪個,而不是讓@autowire註解報錯
     * @Qualifier 根據名稱進行注入,一般是在具備相同的多個類型的實例的一個    注入(例若有多個DataSource類型的實例)
     */
    @Bean
    @Primary
    public DynamicDataSource dataSource(@Qualifier("mainDataSource") DataSource mainDataSource,
                                    @Qualifier("yuntuDataSource") DataSource yuntuDataSource) {
        Map<Object, Object> targetDataSources = new HashMap<>();
        targetDataSources.put(DatabaseType.main, mainDataSource);
        targetDataSources.put(DatabaseType.yuntu, yuntuDataSource);

        DynamicDataSource dataSource = new DynamicDataSource();
        dataSource.setTargetDataSources(targetDataSources);// 該方法是AbstractRoutingDataSource的方法
        dataSource.setDefaultTargetDataSource(mainDataSource);// 默認的datasource設置爲myTestDbDataSource

        return dataSource;
    }

    /**
     * 根據數據源建立SqlSessionFactory
     */
    @Bean
     public SqlSessionFactory sqlSessionFactory(@Qualifier("mainDataSource") DataSource mainDataSource,
                                            @Qualifier("yuntuDataSource") DataSource yuntuDataSource) throws Exception{
                 SqlSessionFactoryBean fb = new SqlSessionFactoryBean();
                fb.setDataSource(this.dataSource(mainDataSource, yuntuDataSource));
                   fb.setTypeAliasesPackage("fm.xiaoai.exmanager");//能夠不設置
                 fb.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml"));
                 return fb.getObject();
             }

    /**
     * 配置事務管理器
     */
    @Bean
    public DataSourceTransactionManager transactionManager(DynamicDataSource dataSource) throws Exception {
        return new DataSourceTransactionManager(dataSource);
    }

}

參考

http://www.cnblogs.com/java-z...springboot

關注個人公衆號第一時間閱讀有趣的技術故事
掃碼關注:

也能夠在微信搜索公衆號便可關注我:codexiulian
渴望與你一塊兒成長進步!微信

相關文章
相關標籤/搜索