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 |
|
2 | "com.example.mybatis.mapper.primary", (basePackages = |
3 | sqlSessionFactoryRef = "PrimarySqlSessionFactory") |
4 | public class PrimaryDataSourceConfig { |
5 | |
6 | /** |
7 | * 配置数据源 |
8 | * |
9 | * @return |
10 | */ |
11 | "PrimaryDataSource") (name = |
12 | "spring.datasource.primary") (prefix = |
13 | public DataSource dataSource() { |
14 | return DataSourceBuilder.create().build(); |
15 | } |
16 | |
17 | /** |
18 | * 配置 sql 会话工厂 |
19 | */ |
20 | "PrimarySqlSessionFactory") (name = |
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 | "PrimaryTransactionManager") (name = |
32 | public DataSourceTransactionManager transactionManager(@Qualifier("PrimaryDataSource") DataSource dataSource) { |
33 | return new DataSourceTransactionManager(dataSource); |
34 | } |
35 | |
36 | "PrimarySqlSessionTemplate") (name = |
37 | public SqlSessionTemplate sqlSessionTemplate(@Qualifier("PrimarySqlSessionFactory") SqlSessionFactory sessionFactory) { |
38 | return new SqlSessionTemplate(sessionFactory); |
39 | } |
40 | } |
数据源二
1 |
|
2 | "com.example.mybatis.mapper.secondary", (basePackages = |
3 | sqlSessionFactoryRef = "SecondarySqlSessionFactory") |
4 | public class SecondaryDataSourceConfig { |
5 | |
6 | /** |
7 | * 配置数据源 |
8 | */ |
9 | "SecondaryDataSource") (name = |
10 | "spring.datasource.secondary") (prefix = |
11 | public DataSource dataSource() { |
12 | return DataSourceBuilder.create().build(); |
13 | } |
14 | |
15 | /** |
16 | * 配置 sql 会话工厂 |
17 | */ |
18 | "SecondarySqlSessionFactory") (name = |
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 | "SecondaryTransactionManager") (name = |
30 | public DataSourceTransactionManager transactionManager(@Qualifier("SecondaryDataSource") DataSource dataSource) { |
31 | return new DataSourceTransactionManager(dataSource); |
32 | } |
33 | |
34 | "SecondarySqlSessionTemplate") (name = |
35 | public SqlSessionTemplate sqlSessionTemplate(@Qualifier("SecondarySqlSessionFactory") SqlSessionFactory sessionFactory) { |
36 | return new SqlSessionTemplate(sessionFactory); |
37 | } |
38 | } |
注意:在 springboot 2.x 之前,需要使用注解 @primary
指定主库,否则会报错。
最后,详细代码可以查看本示例的 Demo。