简介:本文详细介绍如何在 MyBatis-Plus 框架中实现多数据源配置,帮助开发者轻松管理多个数据库连接。
MyBatisPlus(简称MP)是一个基于MyBatis框架的扩展工具,旨在简化数据库操作,提供了CRUD(创建、读取、更新、删除)以及更多高级功能。在大型项目中,常常需要配置多个数据源来处理不同的业务需求,例如:一个数据源用于核心业务,另一个数据源用于日志记录等。本段落将详细介绍如何在Java项目中使用MyBatisPlus配置多数据源。
一、引入依赖
我们需要在项目中添加MyBatisPlus和Spring Boot的多数据源支持相关的依赖。如果是Maven项目,可以在pom.xml文件中添加以下依赖:
```xml
com.baomidou
mybatisplus-boot-starter
3.x.x
org.springframework.boot
spring-boot-starter-jdbc
org.springframework.boot
spring-boot-starter-data-jpa
```
这里请替换`3.x.x`为MyBatisPlus的最新版本。
二、配置多数据源
在Spring Boot的application.yml或application.properties文件中,我们需要配置多个数据源。以下是一个示例配置:
```yaml
spring:
datasource:
primary:
url: jdbc:mysql://localhost:3306/main_db?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
username: root
password: password
driver-class-name: com.mysql.jdbc.Driver
secondary:
url: jdbc:mysql://localhost:3306/secondary_db?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
username: root
password: password
driver-class-name: com.mysql.jdbc.Driver
```
这里,我们配置了两个数据源,分别名为primary和secondary,对应不同的数据库连接信息。
三、配置DataSource
接下来,我们需要自定义一个配置类,使用Spring的`@Configuration`注解,并实现`DataSourceConfigurer`接口:
```java
@Configuration
public class DataSourceConfig implements DataSourceConfigurer {
@Value(${spring.datasource.primary.url})
private String primaryUrl;
@Value(${spring.datasource.primary.username})
private String primaryUsername;
@Value(${spring.datasource.primary.password})
private String primaryPassword;
@Value(${spring.datasource.secondary.url})
private String secondaryUrl;
@Value(${spring.datasource.secondary.username})
private String secondaryUsername;
@Value(${spring.datasource.secondary.password})
private String secondaryPassword;
@Override
public void configureDataSources(DataSourceBuilderRegistry registry) {
主数据源
DataSourceProperties primaryProperties = new DataSourceProperties();
primaryProperties.setUrl(primaryUrl);
primaryProperties.setUsername(primaryUsername);
primaryProperties.setPassword(primaryPassword);
DataSource primaryDataSource = primaryProperties.initializeDataSourceBuilder().build();
次要数据源
DataSourceProperties secondaryProperties = new DataSourceProperties();
secondaryProperties.setUrl(secondaryUrl);
secondaryProperties.setUsername(secondaryUsername);
secondaryProperties.setPassword(secondaryPassword);
DataSource secondaryDataSource = secondaryProperties.initializeDataSourceBuilder().build();
registry.register(primary, primaryDataSource);
registry.register(secondary, secondaryDataSource);
}
}
```
这个配置类将数据源信息注入到Spring容器中。
四、配置事务管理器
为了让Spring能够正确处理多数据源的事务,还需要配置事务管理器:
```java
@Configuration
@EnableTransactionManagement
public class TransactionManagerConfig {
@Bean(name = primaryTransactionManager)
public PlatformTransactionManager primaryTransactionManager(DataSource primaryDataSource) {
return new DataSourceTransactionManager(primaryDataSource);
}
@Bean(name = secondaryTransactionManager)
public PlatformTransactionManager secondaryTransactionManager(DataSource secondaryDataSource) {
return new DataSourceTransactionManager(secondaryDataSource);
}
}
```
五、配置MyBatisPlus
为了使MyBatisPlus与多数据源配合,我们需要创建两个MapperFactoryBean,分别对应两个数据源:
```java
@Configuration
public class MyBatisPlusConfig {
@Autowired
@Qualifier(primaryDataSource)
private DataSource primaryDataSource;
@Autowired
@Qualifier(secondaryDataSource)
private DataSource secondaryDataSource;
@Bean(name = primarySqlSessionFactory)
public SqlSessionFactory primarySqlSessionFactory(@Qualifier(primaryTransactionManager) PlatformTransactionManager transactionManager)
throws Exception {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(primaryDataSource);
factoryBean.setTransactionManager(transactionManager);
return factoryBean.getObject();
}
@Bean(name = secondarySqlSessionFactory)
public SqlSessionFactory secondarySqlSessionFactory(@Qualifier(secondaryTransactionManager) PlatformTransactionManager transactionManager)
throws Exception {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(secondaryDataSource);
factoryBean.setTransactionManager(transactionManager);
return factoryBean.getObject();
}
@Bean(name = primarySqlSessionTemplate)
public SqlSessionTemplate primarySqlSessionTemplate(@Qualifier(primarySqlSessionFactory) SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
@Bean