mybatis plus多數據源配置

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));
		
		
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章