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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值