Mybatis 配置多数据源dataSource
一个项目连接多个数据库,有两种配置方式
- 配置多个数据源使用AOP切换
- 配置多个sqlSessionFactory
针对配置多个sqlSessionFactory进行详解:
1.Apollo配置
- 建立数据源的配置文件
//表示这个类为一个配置类
@Configuration
@Slf4j
// 配置mybatis的接口类放的地方
@MapperScan(basePackages = {"com.guoquan.promotion.dao.repository.seckill"}, sqlSessionTemplateRef = "seckillSqlSessionTemplate")
public class SeckillDataSourceConfig {
// 将这个对象放入Spring容器中
@Bean(name = "seckillDataSource")
// 读取apollo中的配置参数映射成为一个对象
// prefix表示参数的前缀
@ConfigurationProperties(prefix = "seckill.datasource")
public DataSource seckillDataSource() {
DataSource customerDataSource = new DruidDataSource();
return customerDataSource;
}
@Bean
// @Qualifier表示查找Spring容器中名字为test1DataSource的对象
public SqlSessionFactory
seckillSqlSessionFactory(@Qualifier("seckillDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
//添加XML目录
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
try {
// 设置mybatis的xml所在位置
Resource[] res1 = resolver.getResources("classpath*:mapper/seckill/*.xml");
bean.setMapperLocations(res1);
return bean.getObject();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
@Bean
public SqlSessionTemplate seckillSqlSessionTemplate(@Qualifier("seckillSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
SqlSessionTemplate template = new SqlSessionTemplate(sqlSessionFactory);
return template;
}
/******配置事务管理********/
@Bean(name="seckillTransactionManager")
public PlatformTransactionManager seckillTransactionManager(@Qualifier("seckillDataSource") DataSource prodDataSource) {
return new DataSourceTransactionManager(prodDataSource);
}
}
- 默认事务管理器
@Configuration
public class TransactionalManagermentConfig implements TransactionManagementConfigurer {
@Resource(name = "promotionTransactionManager")
private PlatformTransactionManager promotionTransactionManager;
// 实现接口 TransactionManagementConfigurer 方法,其返回值代表在拥有多个事务管理器的情况下默认使用的事务管理器
@Override
public PlatformTransactionManager annotationDrivenTransactionManager() {
return promotionTransactionManager;
}
}
注意点
- mapper 的接口、xml形式以及dao层都需要分开,单独立包
- 在service层中根据不同的业务注入不同的dao层。