mybatis-plus 集成 动态数据源

引入jar包

<dependency>
          <groupId>com.baomidou</groupId>
          <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
          <version>${mybatis-plus.version}</version>
      </dependency>

配置文件

spring:
  autoconfigure:
    exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure  # 为了某些版本的springboot  @SpringBootApplication(exclude= {DataSourceAutoConfiguration.class}) 无法生效
  datasource:
    dynamic:
      primary: master #设置默认的数据源或者数据源组,默认值即为master
      strict: false #设置严格模式,默认false不启动. 启动后在未匹配到指定数据源时候回抛出异常,不启动会使用默认数据源.
      datasource:
        master:
          url: jdbc:mysql://${MYSQL-HOST:test01}:${MYSQL-PORT:3306}/${MYSQL-DB:amz}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true
          username: ${MYSQL-USER:root}
          password: ${MYSQL-PWD:123456}
          driver-class-name: com.mysql.jdbc.Driver
        slave:
          url: jdbc:mysql://${MYSQL-HOST:test01}:${MYSQL-PORT:3307}/${MYSQL-DB:xinwei_shop}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true
          username: ${MYSQL-USER:root}
          password: ${MYSQL-PWD:xinwei2020}
          driver-class-name: com.mysql.jdbc.Driver
    druid:
      initial-size: 10
      max-active: 100
      min-idle: 10
      max-wait: 60000
      pool-prepared-statements: true
      max-pool-prepared-statement-per-connection-size: 20
      time-between-eviction-runs-millis: 60000
      min-evictable-idle-time-millis: 300000
      #validation-query: SELECT 1
      test-while-idle: true
      test-on-borrow: false
      test-on-return: false
      stat-view-servlet:
        enabled: true
        url-pattern: /druid/*
        login-username: druid
        login-password: 123456
      filter:
        stat:
          log-slow-sql: true
          slow-sql-millis: 1000
          merge-sql: false
        wall:
          config:
        multi-statement-allow: true

方法或者类上使用@DS

Seata整合Mybatis-Plus来处理多数据源事务问题,主要是通过以下几个步骤实现的: 1. 安装Mybatis-Plus与Seata插件: 确保你的Mybatis-Plus版本支持Seata插件。可以在`mybatis-plus-generator`的`pom.xml`或`build.gradle`文件中添加Seata的Mybatis-Plus插件依赖。 对于Maven: ```xml <dependency> <groupId>com.baomidou.mybatisplus.extension</groupId> <artifactId>mybatis-plus-extension-boot-starter</artifactId> <!-- Add this if using with Seata --> <exclusions> <exclusion> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-seata</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-seata-mybatisplus</artifactId> </dependency> ``` 对于Gradle: ```gradle implementation 'com.baomidou.mybatisplus.extension:mybatis-plus-extension-boot-starter' implementation 'com.alibaba.cloud:spring-cloud-starter-alibaba-seata-mybatisplus' ``` 2. 配置数据源和Seata: 在Spring Boot的配置文件中(通常是`application.properties`或`application.yml`),继续配置多个数据源以及Seata的相关参数,如RMS地址等。 3. 注册数据源工厂: 创建一个数据源工厂类,用于根据不同业务场景选择对应的数据源: ```java @Configuration public class MultiDataSourceConfig { @Value("${spring.datasource.type}") private String dataSourceType; @Bean @Primary @ConfigurationProperties(prefix = "spring.datasource.${dataSourceType}.") public DataSource masterDataSource() { // ... 实例化主数据源 } @Bean @ConfigurationProperties(prefix = "spring.datasource.secondary.") public DataSource secondaryDataSource() { // ... 实例化从数据源 } @Bean public DataSourceSelector dataSourceSelector() { return () -> { DataSourceContextHolder.setDataSource(dataSourceType); return dataSourceType.equals("primary") ? primaryDataSource() : secondaryDataSource(); }; } } ``` 4. 配置事务管理器: 在`application.yml`或`application.properties`中指定Seata的全局事务管理器(Global Transaction Manager),并启用Mybatis-Plus的分库分表注解支持: ```yaml spring: cloud: alibaba: seata: global-tran-manager-type: JDBC registry-center-config: type: NAMESPACE address: localhost:9091 mybatis-plus: db-config: default-split-sharding-condition-provider-type: TABLE ``` 5. 开始事务: 在Service或Repository层中,使用`@GlobalTransactional`注解启动Seata全局事务,然后在需要操作多数据源的地方插入相应的数据源切换: ```java @Service public class MyService { @Autowired private SeataTemplate seataTemplate; @GlobalTransactional(name = "transactionGroup", rollbackFor = Exception.class) public void multiDataSourceOperation() { // 切换到主数据源 DataSourceContextHolder.setDataSource("primary"); PrimaryDatabaseOperations primaryOps = new PrimaryDatabaseOperations(seataTemplate); // 执行主数据源操作 // 切换到从数据源 DataSourceContextHolder.setDataSource("secondary"); SecondaryDatabaseOperations secondaryOps = new SecondaryDatabaseOperations(seataTemplate); // 执行从数据源操作 } } ``` 当交易完成时,Seata会自动提交或回滚事务,确保跨数据源的事务一致性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值