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
渴望与你一块儿成长进步!微信

相关文章
相关标签/搜索