Mybatis 使用多数据源配置

实现mybatis配置多个数据源,不同的mapper 使用不同的数据源

配置

修改连接信息

将数据库连接信息,由一个改成多个,可以加上一些前缀标识

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#data source config1
spring.datasource.master.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.master.jdbc-url=
spring.datasource.master.username=root
spring.datasource.master.password=12345



#data source config2
spring.datasource.slave.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.slave.jdbc-url=
spring.datasource.slave.username=root
spring.datasource.slave.password=12345

修改mybatis配置信息

多个DataSource

1
2
3
4
5
6
7
8
9
10
11
12
@Primary
@Bean("master_dataSource")
@ConfigurationProperties(prefix = "spring.datasource.master")
public DataSource paymentDataSource() {
return DataSourceBuilder.create().build();
}

@Bean("slave_dataSource")
@ConfigurationProperties(prefix = "spring.datasource.slave")
public DataSource paymentDataSource() {
return DataSourceBuilder.create().build();
}

多个sqlsession Factory

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Primary
@Bean("master_sqlSessionFactory")
public SqlSessionFactory masterSqlSessionFactory(@Qualifier("master_dataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
PathMatchingResourcePatternResolver pathMatchingResourcePatternResolver = new PathMatchingResourcePatternResolver();
//这里这里的xml路径
sqlSessionFactoryBean.setMapperLocations(pathMatchingResourcePatternResolver.getResources("classpath:mapper/a/*.xml"));
return sqlSessionFactoryBean.getObject();
}

@Bean("slave_SqlSessionFactory")
public SqlSessionFactory slaveSqlSessionFactory(@Qualifier("slave_dataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
PathMatchingResourcePatternResolver pathMatchingResourcePatternResolver = new PathMatchingResourcePatternResolver();
sqlSessionFactoryBean.setMapperLocations(pathMatchingResourcePatternResolver.getResources("classpath:mapper/b/*.xml"));
return sqlSessionFactoryBean.getObject();
}


注意:如果使用的是mybatis-plus ,那么这里需要new个 MybatisSqlSessionFactoryBean

多个SqlSessionTemplate

1
2
3
4
5
6
7
8
9
10
11
12
@Primary
@Bean("master_SqlSessionTemplate")
public SqlSessionTemplate masterSqlSessionTemplate(@Qualifier("master_sqlSessionFactory")SqlSessionFactory sqlSessionFactory) throws Exception {
SqlSessionTemplate sqlSessionTemplate = new SqlSessionTemplate(sqlSessionFactory);
return sqlSessionTemplate;
}

@Bean("slave_SqlSessionTemplate")
public SqlSessionTemplate slaveSqlSessionTemplate(@Qualifier("slave_SqlSessionFactory")SqlSessionFactory sqlSessionFactory) throws Exception {
SqlSessionTemplate sqlSessionTemplate = new SqlSessionTemplate(sqlSessionFactory);
return sqlSessionTemplate;
}

多个DataSourceTransactionManager

1
2
3
4
5
6
7
8
9
10
11
12
@Primary
@Bean("master_TransactionManager")
public DataSourceTransactionManager masterTransactionManager(@Qualifier("master_dataSource") DataSource dataSource){
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(dataSource);
return transactionManager;
}

@Bean("slave_TransactionManager")
public DataSourceTransactionManager slaveTransactionManager(@Qualifier("slave_dataSource") DataSource dataSource){
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(dataSource);
return transactionManager;
}

修改@Mapper

注意 MapperScan 注解中的属性;

sqlSessionTemplateRef 和 sqlSessionFactoryRef 这2个值可以当spring中有多个bean的时候指定特定的bean

1
2
3
4
5
6
7
@MapperScan(basePackages = "com.mapper.a",sqlSessionFactoryRef = "master_SqlSessionFactory",sqlSessionTemplateRef = "master_SqlSessionTemplate")



class A
@MapperScan(basePackages = "com.mapper.b",sqlSessionFactoryRef = "slave_SqlSessionFactory",sqlSessionTemplateRef = "slave_SqlSessionTemplate")
class B

要点:

  • 多个相同类型的bean 注意指定 @Primary
  • sqlsessionfactory 中的xml路径是不同的注意区分
  • @Qualifier 指定使用哪个bean的实现
  • @MapperScan 扫描时指定不同的扫描包,sessionfactroy 等信息