SpringBoot+MybatisPlus+HikariCP实现多数据源动态切换

在实际工作中,我们的系统可能是多个数据源,通过集成MyBatis-Plus和HikariCP实现多数据源动态切换是一个常见的需求。以下是一个详细的实现步骤,你可以根据自己的需要进行调整。

1. 添加依赖

首先,在pom.xml文件中添加所需的依赖:

<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.7.5</version>
		<relativePath />
</parent>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-aop</artifactId>
		</dependency>
		<!-- MyBatis-Plus -->
		<dependency>
			<groupId>com.baomidou</groupId>
			<artifactId>mybatis-plus-boot-starter</artifactId>
			<version>3.5.5</version>
		</dependency>
		<!-- 数据库驱动 -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<scope>runtime</scope>
		</dependency>
	</dependencies>

HikariCP数据源不需要额外导包,springboot自动引入

2. 配置数据源属性

application.yml文件中配置多个数据源属性:

3. 配置数据源

创建一个配置类来配置多个数据源:

package com.work.config;
import java.util.HashMap;
import java.util.Map;
import javax.sql.DataSource;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import com.work.enums.DatabaseTypeEnum;
import com.zaxxer.hikari.HikariDataSource;

/**
 * springboot整合mybatis-plus 实现多数据源动态切换
 * 配置数据源和事务管理器 
 * @author summer
 */
@Configuration
@MapperScan(basePackages = "com.work.mapper", sqlSessionFactoryRef = "sqlSessionFactory")
public class DataSourceConfig {
	/**
	 * 主库数据源
	 * @return
	 */
    @Bean(name = "masterDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.master")
    public Da
### Spring Boot 和 MyBatis Plus 实现多数据源配置 #### 添加依赖和配置文件 为了在Spring Boot项目中使用MyBatis Plus实现多数据源配置,首先需要添加必要的Maven依赖。这包括`spring-boot-starter-jdbc`, `mybatis-plus-boot-starter`以及其他可能需要用到的数据源连接池库,如HikariCP。 ```xml <dependencies> <!-- spring boot jdbc --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <!-- mybatis plus starter --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>${mybatis.plus.version}</version> </dependency> <!-- 数据库驱动, 如MySQL --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <!-- HikariCP 连接池 --> <dependency> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> </dependency> </dependencies> ``` 接着,在`application.yml`或`application.properties`中定义各个数据源的具体参数[^1]。 对于YAML格式: ```yaml spring: datasource: master: url: jdbc:mysql://localhost:3306/db_master?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver slave: url: jdbc:mysql://localhost:3306/db_slave?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.DataSource ``` #### 创建动态数据源类 创建一个名为DynamicDataSource的类用于管理多个数据源之间的切换逻辑,并将其注册到Spring容器内作为默认的数据源组件。 ```java @Configuration public class DataSourceConfig { @Bean(name = "masterDataSource") @ConfigurationProperties(prefix = "spring.datasource.master") public DataSource masterDataSource() { return DataSourceBuilder.create().build(); } @Bean(name = "slaveDataSource") @ConfigurationProperties(prefix = "spring.datasource.slave") public DataSource slaveDataSource() { return DataSourceBuilder.create().build(); } @Primary @Bean(name = "dynamicDataSource") public DynamicDataSource dataSource(@Qualifier("masterDataSource") DataSource masterDataSource, @Qualifier("slaveDataSource") DataSource slaveDataSource) { Map<Object, Object> targetDataSources = new HashMap<>(); targetDataSources.put(DataSourceEnum.MASTER.name(), masterDataSource); targetDataSources.put(DataSourceEnum.SLAVE.name(), slaveDataSource); DynamicDataSource dynamicDataSource = new DynamicDataSource(); dynamicDataSource.setTargetDataSources(targetDataSources); // 设置候选数据源 dynamicDataSource.setDefaultTargetDataSource(masterDataSource); // 默认数据源 return dynamicDataSource; } } ``` 这里假设已经有一个枚举类型`DataSourceEnum`用来表示不同的数据源名称[^3]。 #### 编写自定义注解与AOP切面 为了让业务层能够方便地指定要使用的具体数据源,可以编写一个简单的自定义注解@DS并配合AOP技术实现在方法调用前自动设置当前线程上下文中应使用的数据源。 ```java // 自定义注解 DS.java import java.lang.annotation.*; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) @Documented public @interface DS { String value(); // 指定数据源key } // AOP 切面处理 AspectDSRouter.java @Component @Aspect @Slf4j public class AspectDSRouter { private static final ThreadLocal<String> contextHolder = new InheritableThreadLocal<>(); @Around("@annotation(com.example.DS)") public Object around(ProceedingJoinPoint point) throws Throwable { MethodSignature signature = (MethodSignature)point.getSignature(); Method method = signature.getMethod(); DS ds = method.getDeclaredAnnotation(DS.class); if(ds != null){ String originalDs = getDataSource(); setDataSource(ds.value()); try{ return point.proceed(); }finally { setDataSource(originalDs); } } return point.proceed(); } protected void setDataSource(String dsName){ log.debug("Switch to [" + dsName + "] data source"); contextHolder.set(dsName); } protected String getDataSource(){ return contextHolder.get(); } } ``` 最后一步是在全局范围内拦截SQL执行请求之前读取当前线程绑定的数据源标识符,并据此调整实际使用的物理连接对象[^4]。 通过上述步骤即可完成基本的多数据源配置工作。当然,根据项目的复杂度和个人需求还可以进一步优化和完善此方案。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值