1.添加DataSourceType枚舉
package com.immo.phamacybus.common;
/**
* 所有數據源的key
* @author Linhai.Tan
*
*/
public enum DataSourceType {
/**
* 默認的數據源
*/
DEFAULT,
/**
* 新增的數據源
*/
SOURCE2;
}
2.添加MoreDataSourceConfig類
package com.immo.phamacybus.config;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
import com.immo.phamacybus.common.DataSourceType;
/**
* 當前線程需要操作的數據源的標記
* @author Linhai.Tan 2018-4-26
*
*/
public class MoreDataSourceConfig extends AbstractRoutingDataSource {
private static final ThreadLocal<DataSourceType> dbName = new ThreadLocal<>();
public static void setDbName(DataSourceType type) {
dbName.set(type);
}
public static DataSourceType getDbName() {
return dbName.get();
}
@Override
protected Object determineCurrentLookupKey() {
DataSourceType key =getDbName();
if (key != null) {
return key;
}
return DataSourceType.DEFAULT;
}
}
3.創建DataSourceConfig類,配置多數據源
package com.immo.phamacybus.config;
import java.util.HashMap;
import java.util.Map;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import com.alibaba.druid.pool.DruidDataSource;
import com.immo.phamacybus.common.DataSourceType;
/**
* 多數據源配置,不配置多數據源可以去掉
* @author Linhai.Tan 2018-4-26
*
*/
@Configuration
public class DataSourceConfig {
@Autowired
private Environment env;
public DataSource dataSource1() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(env.getProperty("spring.datasource.driverClassName"));
dataSource.setUrl(env.getProperty("spring.datasource.url"));
dataSource.setUsername(env.getProperty("spring.datasource.username"));
dataSource.setPassword(env.getProperty("spring.datasource.password"));
dataSource.setInitialSize(Integer.valueOf(env.getProperty("spring.datasource.initial-size")));
dataSource.setMaxActive(Integer.valueOf(env.getProperty("spring.datasource.max-active")));
dataSource.setMinIdle(Integer.valueOf(env.getProperty("spring.datasource.min-idle")));
dataSource.setMaxWait(Integer.valueOf(env.getProperty("spring.datasource.max-wait")));
return dataSource;
}
public DataSource dataSource2() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(env.getProperty("spring.datasource.driverClassName2"));
dataSource.setUrl(env.getProperty("spring.datasource.url2"));
dataSource.setUsername(env.getProperty("spring.datasource.username2"));
dataSource.setPassword(env.getProperty("spring.datasource.password2"));
dataSource.setInitialSize(Integer.valueOf(env.getProperty("spring.datasource.initial-size")));
dataSource.setMaxActive(Integer.valueOf(env.getProperty("spring.datasource.max-active")));
dataSource.setMinIdle(Integer.valueOf(env.getProperty("spring.datasource.min-idle")));
dataSource.setMaxWait(Integer.valueOf(env.getProperty("spring.datasource.max-wait")));
return dataSource;
}
@Bean("dataSource")
public DataSource getDataSource() {
Map<Object, Object> targetDataSources = new HashMap<>();
targetDataSources.put(DataSourceType.DEFAULT, dataSource1());
targetDataSources.put(DataSourceType.SOURCE2, dataSource2());
MoreDataSourceConfig dataSources=new MoreDataSourceConfig();
dataSources.setTargetDataSources(targetDataSources);// 該方法是AbstractRoutingDataSource的方法
dataSources.setDefaultTargetDataSource(targetDataSources.get(DataSourceType.DEFAULT));// 默認的datasource
return dataSources;
}
}
4.把dataSources設置到sqlSessionFactory
@Bean("mybatisSqlSession")
public MybatisSqlSessionFactoryBean sqlSessionFactory(DataSource dataSource, ResourceLoader resourceLoader,
GlobalConfiguration globalConfiguration) throws Exception {
globalConfiguration.setDbType(DB_TYPE);
MybatisSqlSessionFactoryBean sqlSessionFactory = new MybatisSqlSessionFactoryBean();
sqlSessionFactory.setVfs(SpringBootVFS.class);
sqlSessionFactory.setDataSource(dataSource);
sqlSessionFactory.setTypeAliasesPackage("com.immo.**.entity*");
sqlSessionFactory
.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:/mapper/**/*Mapper.xml"));
MybatisConfiguration configuration = new MybatisConfiguration();
configuration.setDefaultScriptingLanguage(MybatisXMLLanguageDriver.class);
configuration.setJdbcTypeForNull(JdbcType.NULL);
sqlSessionFactory.setConfiguration(configuration);
sqlSessionFactory.setPlugins(new Interceptor[] { new PaginationInterceptor(), new PerformanceInterceptor(),
new OptimisticLockerInterceptor() });
sqlSessionFactory.setGlobalConfig(globalConfiguration);
return sqlSessionFactory;
}
5.測試
package com.immo.test;
import java.util.List;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.alibaba.fastjson.JSONObject;
import com.immo.PhamacyBusApplication;
import com.immo.phamacybus.common.DataSourceType;
import com.immo.phamacybus.config.MoreDataSourceConfig;
import com.immo.phamacybus.kettle.entity.KUser;
/**
* 測試多數據源配置
* @author Linhai.Tan 2018-4-12
*
*/
import com.immo.phamacybus.kettle.service.KUserService;
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes=PhamacyBusApplication.class)
public class MoreDataSourceTest {
@Autowired
private KUserService kUserService;
@Test
public void execute() {
/**
* 查詢默認數據源
*/
List<KUser> db1 = kUserService.selectAll();
System.out.println(JSONObject.toJSON(db1));
/**
* 查詢第二個數據源
*/
MoreDataSourceConfig.setDbName(DataSourceType.SOURCE2);//可以改成註解+aop方式實現
List<KUser> db2 = kUserService.selectAll();
System.out.println(JSONObject.toJSON(db2));
}
}