学习在 Spring Boot 中使用 MyBatis 多数据源来操作不同的数据库。
1 创建工程并配置
新建 Spring Boot 项目 spring-boot-mybatismulti
,添加 Web/MyBatis/MySQL
依赖,如下:
之后手动在 pom 文件中添加 Druid 数据库连接池依赖(Spring Boot 版本),最终的依赖如下:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
<version>5.1.27</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
接着在 application.properties
配置文件中添加数据库相关信息的配置,有两组配置,用 one 和 two 区分,如下:
spring.datasource.one.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.one.username=root
spring.datasource.one.password=000000
spring.datasource.one.url=jdbc:mysql://127.0.0.1:3306/cxy35?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&autoReconnectForPools=true
spring.datasource.two.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.two.username=root
spring.datasource.two.password=000000
spring.datasource.two.url=jdbc:mysql://127.0.0.1:3306/cxy35_2?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&autoReconnectForPools=true
- 数据源配置
因为配置数据库的 key 变化了,导致上述配置无法被 Spring Boot 自动加载,需要我们自己去加载。增加 DataSourceConfig
数据源配置类,使用 Spring Boot 提供的类型安全的属性注入方式来加载上述配置,并创建对应的两个数据源 DataSource
实例,如下:
@Configuration
public class DataSourceConfig {
@Bean
@ConfigurationProperties(prefix = "spring.datasource.one")
DataSource dsOne() {
return DruidDataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties(prefix = "spring.datasource.two")
DataSource dsTwo() {
return DruidDataSourceBuilder.create().build();
}
}
- MyBatis 配置
接下来是 MyBatis 的配置,新增 MyBatisConfigOne
和 MyBatisConfigTwo
两个配置类,用上述两个数据源分别创建对应的 SqlSessionFactory
和 SqlSessionTemplate
实例(注意 Bean 的名称要不一样),分别如下:
@Configuration
@MapperScan(basePackages = "com.cxy35.sample.springboot.mybatismulti.mapper1", sqlSessionFactoryRef = "sqlSessionFactory1", sqlSessionTemplateRef = "sqlSessionTemplate1")
public class MyBatisConfigOne {
// 此时 Spring 容器中有两个 DataSource 类型的 Bean ,所以这里需要按名称 byName 查找
@Autowired
@Qualifier("dsOne")
DataSource dsOne;
@Bean
SqlSessionFactory sqlSessionFactory1() {
SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
try {
factory.setDataSource(dsOne);
return factory.getObject();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Bean
SqlSessionTemplate sqlSessionTemplate1() {
return new SqlSessionTemplate(sqlSessionFactory1());
}
}
@Configuration
@MapperScan(basePackages = "com.cxy35.sample.springboot.mybatismulti.mapper2", sqlSessionFactoryRef = "sqlSessionFactory2", sqlSessionTemplateRef = "sqlSessionTemplate2")
public class MyBatisConfigTwo {
// 此时 Spring 容器中有两个 DataSource 类型的 Bean ,所以这里需要按名称 byName 查找
@Autowired
@Qualifier("dsTwo")
DataSource dsTwo;
@Bean
SqlSessionFactory sqlSessionFactory2() {
SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
try {
factory.setDataSource(dsTwo);
return factory.getObject();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Bean
SqlSessionTemplate sqlSessionTemplate2() {
return new SqlSessionTemplate(sqlSessionFactory2());
}
}
关于 MyBatis 配置类的说明:
- 配置 mapper 的位置:通过
basePackages
分别配置了扫描mapper1
和mapper2
路径,之后在这两个路径下放XxxMapper.java
和XxxMapper.xml
,所有操作会自动对应着不同的数据源。 - 通过
sqlSessionFactoryRef
和sqlSessionTemplateRef
分别指定不同 Bean 的引用名字。
2 使用
配置完成之后,在对应的位置分别提供实体类和 mapper 即可。关于 MyBatis 的使用,可以参考 Spring Boot 整合 MyBatis ,这里不再赘述。
- Spring Boot 教程合集(微信左下方阅读全文可直达)。
- Spring Boot 教程合集示例代码:https://github.com/cxy35/spring-boot-samples
- 本文示例代码:https://github.com/cxy35/spring-boot-samples/tree/master/spring-boot-dao/spring-boot-mybatismulti
扫码关注微信公众号 程序员35 ,获取最新技术干货,畅聊 #程序员的35,35的程序员# 。独立站点:https://cxy35.com