Spring Boot 集成 MyBatis(XML 方式)实现多数据源配置

在实际开发中,我们会遇到一个应用需要访问多个数据源的情况。因此,我们需要配置多个数据源。这里我们来看看使用 MyBatis(XML 方式)实现多数据源配置。

添加相关依赖

1
<dependency>
2
    <groupId>org.mybatis.spring.boot</groupId>
3
    <artifactId>mybatis-spring-boot-starter</artifactId>
4
    <version>1.3.1</version>
5
</dependency>

配置数据源信息

  • application.properties
1
# 数据源一
2
spring.datasource.primary.jdbc-url=jdbc:mysql://localhost:3306/game?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
3
spring.datasource.primary.username=root
4
spring.datasource.primary.password=root
5
spring.datasource.primary.driver-class-name=com.mysql.jdbc.Driver
6
7
# 数据源二
8
spring.datasource.secondary.jdbc-url=jdbc:mysql://localhost:3306/product?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
9
spring.datasource.secondary.username=root
10
spring.datasource.secondary.password=root
11
spring.datasource.secondary.driver-class-name=com.mysql.jdbc.Driver

配置多数据源

集成 MyBatis 配置数据源步骤如下:

  • 创建数据源 Datasource
  • 创建 Session 会话工厂 SqlSessionFactroy
  • 创建数据库事务 DataSourceTransactionManager
  • 创建 SqlSessionTemplate

最关键的地方就是数据源配置这部分,需要一层一层注入,先创建DataSource,再创建SqlSessionFactory,然后再创建事务管理器DataSourceTransactionManager,最后包装到SqlSessionTemplate中。

数据源一

1
@Configuration
2
@MapperScan(basePackages = "com.example.mybatis.mapper.primary", sqlSessionTemplateRef = "PrimarySqlSessionTemplate")
3
public class DataSourcePrimaryConfig {
4
5
    @Bean(name = "PrimaryDataSource")
6
    @Primary
7
    @ConfigurationProperties(prefix = "spring.datasource.primary")
8
    public DataSource dataSourcePrimary() {
9
       return new DruidDataSource();
10
    }
11
12
    @Bean(name = "PrimarySqlSessionFactory")
13
    @Primary
14
    public SqlSessionFactory sqlSessionFactoryPrimary(@Qualifier("PrimaryDataSource") DataSource dataSource) throws Exception {
15
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
16
        sqlSessionFactoryBean.setDataSource(dataSource);
17
        sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
18
                .getResources("classpath:mybatis/mapper/primary/*.xml"));
19
20
        return sqlSessionFactoryBean.getObject();
21
    }
22
23
    @Bean(name = "PrimaryTransactionManager")
24
    @Primary
25
    public DataSourceTransactionManager transactionManagerPrimary(@Qualifier("PrimaryDataSource") DataSource dataSource) {
26
        return new DataSourceTransactionManager(dataSource);
27
    }
28
29
    @Bean(name = "PrimarySqlSessionTemplate")
30
    @Primary
31
    public SqlSessionTemplate sqlSessionTemplatePrimary(@Qualifier("PrimarySqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
32
        return new SqlSessionTemplate(sqlSessionFactory);
33
    }
34
35
}

数据源二

1
@Configuration
2
@MapperScan(basePackages = "com.example.mybatis.mapper.secondary", sqlSessionTemplateRef = "SecondarySqlSessionTemplate")
3
public class DataSourceSecondaryConfig {
4
5
    @Bean(name = "SecondaryDataSource")
6
    @ConfigurationProperties(prefix = "spring.datasource.secondary")
7
    public DataSource dataSource() {
8
        return new DruidDataSource();
9
    }
10
11
    @Bean(name = "SecondarySqlSessionFactory")
12
    public SqlSessionFactory sqlSessionFactorySecondary(@Qualifier("SecondaryDataSource") DataSource dataSource) throws Exception {
13
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
14
        factoryBean.setDataSource(dataSource);
15
        factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
16
                .getResources("classpath:mybatis/mapper/secondary/*.xml"));
17
18
        return factoryBean.getObject();
19
20
    }
21
22
    @Bean(name = "SecondaryTransactionManager")
23
    public DataSourceTransactionManager transactionManagerSecondary(@Qualifier("SecondaryDataSource") DataSource dataSource) {
24
        return new DataSourceTransactionManager(dataSource);
25
    }
26
27
    @Bean(name = "SecondarySqlSessionTemplate")
28
    public SqlSessionTemplate sqlSessionTemplateSecondary(@Qualifier("SecondarySqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
29
        return new SqlSessionTemplate(sqlSessionFactory);
30
    }
31
}

以上配置完成之后,集成 MyBatis 多数据源配置就已经完成了,接下来就可以操作数据啦!

最后,详细代码可以查看本示例的 Demo。

源码地址

springboot-multidatasource-mybatis-xml