MyBatisPlus多数据库配置(多数据源配置)

主要解决的多数据源的配置,可以分库选择处理数据信息.

1.依赖引入(pom)

mybatispuls依赖+mybatisplus多数据源

 <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.2</version>
        </dependency>
<dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
            <version>3.1.0</version>
        </dependency>

2.yml文件配置(对应好 datasource的位置)

spring
  datasource:
    dynamic:
      primary: db #配置主数据源
      strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
      datasource:
        db: # 数据源的名字,第一个数据源
          url: jdbc:mysql://xxx:8080/db?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone
### MyBatis Plus 配置多数据源支持不同数据库的最佳实践 #### 1. 添加依赖项 为了使 Spring Boot 应用程序能够使用 MyBatis Plus 并管理多个数据源,需在 `pom.xml` 文件中引入必要的依赖项。 ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.2</version> </dependency> <!-- 数据库驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> ``` #### 2. 定义数据源属性 通过 application.yml 或者 application.properties 来定义各个数据源的具体参数。这里以 YAML 格式为例: ```yaml spring: datasource: master: url: jdbc:mysql://localhost:3306/db_master?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver slave: url: jdbc:mysql://localhost:3307/db_slave?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver ``` #### 3. 创建动态数据源配置类 编写一个 Java 类来注册这些数据源到 Spring 上下文中,并指定默认使用的数据源。 ```java @Configuration public class DynamicDataSourceConfig { @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; } } ``` #### 4. 实现线程局部变量控制逻辑 利用ThreadLocal机制保存当前请求所要访问的目标数据源名称,在每次查询前设置好对应的值即可完成切换工作。 ```java public class DataSourceContextHolder { private static final ThreadLocal<String> contextHolder = new ThreadLocal<>(); public static void setDbType(String dbType){ contextHolder.set(dbType); } public static String getDbType(){ return contextHolder.get(); } public static void clearDbType(){ contextHolder.remove(); } } // 枚举类型用于表示不同的数据源名 enum DataSourceEnum{ MASTER, SLAVE } ``` #### 5. 自定义切面处理事务传播行为 当业务层调用了涉及跨库的操作时,则需要借助AOP技术来进行统一管理和维护。 ```java @Aspect @Component @Slf4j public class DataSourceAspect { @Around("@annotation(com.example.annotation.DataSource)") public Object around(ProceedingJoinPoint point) throws Throwable { MethodSignature signature = (MethodSignature)point.getSignature(); Method method = signature.getMethod(); DataSource ds = method.getAnnotation(DataSource.class); if(ds != null && !ds.value().isEmpty()){ log.info("Switch to [" + ds.value() + "] data source."); DataSourceContextHolder.setDbType(ds.value()); } try { return point.proceed(); } finally { DataSourceContextHolder.clearDbType(); } } } ``` 以上就是基于 MyBatis Plus 的多数据源解决方案[^1]。此方案不仅实现了读写分离的功能,还简化了开发人员对于复杂环境下持久化层的设计难度[^2]。同时,该方式具有良好的扩展性和灵活性,便于后期运维团队根据实际需求调整策略[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值