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

MyBatis 注解方式配置多数据源与 XML 方式大同小异,唯一不同是注解方式不用指定 XML 文件的位置。

配置数据源信息

  • application.properties
1
# 数据源一
2
spring.datasource.resource1.driver-class-name=com.mysql.jdbc.Driver
3
# 注意区分 spring.datasource.url 与自定义jdbc配置的 jdbc-url
4
spring.datasource.resource1.jdbc-url=jdbc:mysql://localhost:3306/game?useUnicode=true&characterEncoding=utf-8
5
spring.datasource.resource1.username=root
6
spring.datasource.resource1.password=root
7
8
# 数据源二
9
spring.datasource.resource2.driver-class-name=com.mysql.jdbc.Driver
10
spring.datasource.resource2.jdbc-url=jdbc:mysql://localhost:3306/bookstore?useUnicode=true&characterEncoding=utf-8
11
spring.datasource.resource2.username=root
12
spring.datasource.resource2.password=root

配置多数据源

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

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

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

数据源一

1
@Configuration
2
@MapperScan(basePackages = "com.example.mybatis.mapper.primary",
3
        sqlSessionFactoryRef = "PrimarySqlSessionFactory")
4
public class PrimaryDataSourceConfig {
5
6
    /**
7
     * 配置数据源
8
     *
9
     * @return
10
     */
11
    @Bean(name = "PrimaryDataSource")
12
    @ConfigurationProperties(prefix = "spring.datasource.primary")
13
    public DataSource dataSource() {
14
        return DataSourceBuilder.create().build();
15
    }
16
17
    /**
18
     * 配置 sql 会话工厂
19
     */
20
    @Bean(name = "PrimarySqlSessionFactory")
21
    public SqlSessionFactory sessionFactory(@Qualifier("PrimaryDataSource") DataSource dataSource) throws Exception {
22
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
23
        bean.setDataSource(dataSource);
24
25
        return bean.getObject();
26
    }
27
28
    /**
29
     * 事务管理器
30
     */
31
    @Bean(name = "PrimaryTransactionManager")
32
    public DataSourceTransactionManager transactionManager(@Qualifier("PrimaryDataSource") DataSource dataSource) {
33
        return new DataSourceTransactionManager(dataSource);
34
    }
35
36
    @Bean(name = "PrimarySqlSessionTemplate")
37
    public SqlSessionTemplate sqlSessionTemplate(@Qualifier("PrimarySqlSessionFactory") SqlSessionFactory sessionFactory) {
38
        return new SqlSessionTemplate(sessionFactory);
39
    }
40
}

数据源二

1
@Configuration
2
@MapperScan(basePackages = "com.example.mybatis.mapper.secondary",
3
        sqlSessionFactoryRef = "SecondarySqlSessionFactory")
4
public class SecondaryDataSourceConfig {
5
6
    /**
7
     * 配置数据源
8
     */
9
    @Bean(name = "SecondaryDataSource")
10
    @ConfigurationProperties(prefix = "spring.datasource.secondary")
11
    public DataSource dataSource() {
12
        return DataSourceBuilder.create().build();
13
    }
14
15
    /**
16
     * 配置 sql 会话工厂
17
     */
18
    @Bean(name = "SecondarySqlSessionFactory")
19
    public SqlSessionFactory sessionFactory(@Qualifier("SecondaryDataSource") DataSource dataSource) throws Exception {
20
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
21
        bean.setDataSource(dataSource);
22
23
        return bean.getObject();
24
    }
25
26
    /**
27
     * 事务管理器
28
     */
29
    @Bean(name = "SecondaryTransactionManager")
30
    public DataSourceTransactionManager transactionManager(@Qualifier("SecondaryDataSource") DataSource dataSource) {
31
        return new DataSourceTransactionManager(dataSource);
32
    }
33
34
    @Bean(name = "SecondarySqlSessionTemplate")
35
    public SqlSessionTemplate sqlSessionTemplate(@Qualifier("SecondarySqlSessionFactory") SqlSessionFactory sessionFactory) {
36
        return new SqlSessionTemplate(sessionFactory);
37
    }
38
}

注意:在 springboot 2.x 之前,需要使用注解 @primary 指定主库,否则会报错。

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

源码地址

springboot-multidatasource-mybatis-annotation