java吧 关注:1,188,574贴子:12,595,989

回复:玩个有意思的玩意,mybatis切换数据源

只看楼主收藏回复

太复杂了,我还是喜欢简单的,下面这样就行了:
@Configuration
@MapperScan(basePackages = PrimaryDatasourceConfig.PACKAGE,
sqlSessionFactoryRef = "primarySqlSessionFactory")
public class PrimaryDatasourceConfig {
//mapper扫描路径
static final String PACKAGE = "com.ldw.mapper.primary";
//mybatis xml扫描路径
private static final String MAPPER_LOCATION = "classpath:sqlmap/primary/*.xml";
/***
* 根据application.yml文件中的spring.datasource.primary,
* 创建数据源链接
* @return
*/
@Bean(name = "primarydatasource")
@Qualifier("primarydatasource")
@Primary
@ConfigurationProperties(prefix="spring.datasource.primary")
public DataSource primaryDataSource() {
return DruidDataSourceBuilder.create().build();
}
/**
* 配置事务管理
* @return
*/
@Bean(name = "primaryTransactionManager")
@Primary
public DataSourceTransactionManager primaryTransactionManager() {
return new DataSourceTransactionManager(primaryDataSource());
}
/**
* Sql会话工厂配置
* @param dataSource
* @return
* @throws Exception
*/
@Bean(name = "primarySqlSessionFactory")
@Primary
public SqlSessionFactory primarySqlSessionFactory(
@Qualifier("primarydatasource") DataSource dataSource) throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
//如果不使用xml的方式配置mapper,则可以省去下面这行mapper location的配置。
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources(PrimaryDatasourceConfig.MAPPER_LOCATION));
return sessionFactory.getObject();
}
}
@Configuration
@MapperScan(basePackages = SecondaryDatasourceConfig.PACKAGE,
sqlSessionFactoryRef = "secondarySqlSessionFactory")
public class SecondaryDatasourceConfig {
//mapper扫描路径
static final String PACKAGE = "com.ldw.mapper.secondary";
//mybatis xml扫描路径
private static final String MAPPER_LOCATION = "classpath:sqlmap/secondary/*.xml";
/***
* 根据application.yml文件中的spring.datasource.secondary
* 创建数据源
* @return
*/
@Bean(name = "secondarydatasource")
@Qualifier("secondarydatasource")
//@Primary
@ConfigurationProperties(prefix="spring.datasource.secondary")
public DataSource secondaryDataSource() {
return DruidDataSourceBuilder.create().build();
}
@Bean(name = "secondaryTransactionManager")
//@Primary
public DataSourceTransactionManager oracleTransactionManager() {
return new DataSourceTransactionManager(secondaryDataSource());
}
@Bean(name = "secondarySqlSessionFactory")
//@Primary
public SqlSessionFactory secondarySqlSessionFactory(
@Qualifier("secondarydatasource") DataSource dataSource) throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
//如果不使用xml的方式配置mapper,则可以省去下面这行mapper location的配置。
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources(SecondaryDatasourceConfig.MAPPER_LOCATION));
return sessionFactory.getObject();
}
}


49楼2020-09-13 22:48
收起回复
    你这个整复杂了,引入dynamic-datasource-spring-boot-starter直接在service类或mapper类上或类里的方法上标注@(DS="数据源名称")就行了


    IP属地:四川51楼2020-09-14 10:55
    收起回复
      大哥,多数据源,如果我故意写错一个,项目直接跑不起来吗


      IP属地:云南来自手机贴吧52楼2020-12-31 00:32
      回复
        支持多数据源回滚吗


        IP属地:广东来自Android客户端53楼2021-05-07 01:01
        收起回复