springboot + mybatis 多数据源简单配置

区分包扫描方法 (正在使用的方法)

@Configuration
//配置包扫描路径
@MapperScan(basePackages = TiDBDataSourceConfig.PACKAGE, 
sqlSessionFactoryRef = "tiDBSqlSessionFactory")
public class TiDBDataSourceConfig {
	//当前数据源 包扫描路径
	static final String PACKAGE = "com.zto.monitor.dal.dao.tidb";
	//当前数据源 mapper映射扫描路径
	static final String MAPPER_LOCATION = "classpath:com/zto/dal/dao/tidb/*.xml";

	@Value("${spring.datasourceTiDB.url}")
	private String url;

	@Value("${spring.datasourceTiDB.username}")
	private String user;

	@Value("${spring.datasourceTiDB.password}")
	private String password;

	@Value("${spring.datasourceTiDB.driver-class-name}")
	private String driverClass;

	//配置数据源 名为tiDBDataSource
	@Bean(name = "tiDBDataSource")
	public DataSource tiDBDataSource() {
		//新建druid数据源 使用druid连接池
		DruidDataSource dataSource = new DruidDataSource();
		dataSource.setDriverClassName(driverClass);
		dataSource.setUrl(url);
		dataSource.setUsername(user);
		dataSource.setPassword(password);
		return dataSource;
	}

	//配置事务管理器 名为tiDBTransactionManager
	@Bean(name = "tiDBTransactionManager")
	public DataSourceTransactionManager tiDBTransactionManager() {
		return new DataSourceTransactionManager(tiDBDataSource());
	}

	//配置sessionFactory
	@Bean(name = "tiDBSqlSessionFactory")
	public SqlSessionFactory tiDBSqlSessionFactory(@Qualifier("tiDBDataSource") DataSource tiDBDataSource)
			throws Exception {
		//新建sessionFactory
		final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
		//设置数据源为当前数据源
		sessionFactory.setDataSource(tiDBDataSource);
		//设置mapper映射路径
		sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
				.getResources(TiDBDataSourceConfig.MAPPER_LOCATION));
		return sessionFactory.getObject();
	}
}

aop

简介: 用这种方式实现多数据源的前提必须要清楚两个知识点:AOP原理和AbstractRoutingDataSource抽象类。

1、AOP:这个东西。。。不切当的说就是相当于拦截器,只要满足要求的都会被拦截过来,然后进行一些列的操作。具体需要自己去体会。。。

2、AbstractRoutingDataSource:这个类是实现多数据源的关键,他的作用就是动态切换数据源,实质:有多少个数据源就存多少个数据源在targetDataSources(是AbstractRoutingDataSource的一个map类型的属性,其中value为每个数据源,key表示每个数据源的名字)这个属性中,然后根据determineCurrentLookupKey()这个方法获取当前数据源在map中的key值,然后determineTargetDataSource()方法中动态获取当前数据源,如果当前数据源不存并且默认数据源也不存在就抛出异常。
————————————————
参考链接:https://blog.csdn.net/tuesdayma/article/details/81081666

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值