在開發中,有時候咱們的數據庫是作了讀寫分庫的處理的。那麼在開發使用的時候須要讀取不一樣來源的數據庫,咱們須要配置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)安全
/** * 列出全部的數據源key(經常使用數據庫名稱來命名) * 注意: * 1)這裏數據源與數據庫是一對一的 * 2)DatabaseType中的變量名稱就是數據庫的名稱 * @Author xuelongjiang */ public enum DatabaseType { main,yuntu }
/** * 保存一個線程安全的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(); } }
/** * 動態數據源(須要繼承AbstractRoutingDataSource) * @Author xuelongjiang */ public class DynamicDataSource extends AbstractRoutingDataSource{ @Nullable @Override protected Object determineCurrentLookupKey() { return DatabaseContextHolder.getDatabaseType(); } }
/** * 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
渴望與你一塊兒成長進步!微信