备案博客域名做视频网站会怎么样,wap网站开发,万网发布网站,怎样做网站开发文章目录 简述本文涉及代码已开源 项目配置pom引入baomidouyml增加dynamic配置启动类增加注解配置结束 业务调用注解DS()TransactionalDSTransactional自定义数据源注解MySQL2 测试调用查询接口单数据源事务测试多数据源事务如果依然使用Transactional会怎样#xff1f;测试正… 文章目录 简述本文涉及代码已开源 项目配置pom引入baomidouyml增加dynamic配置启动类增加注解配置结束 业务调用注解DS()TransactionalDSTransactional自定义数据源注解MySQL2 测试调用查询接口单数据源事务测试多数据源事务如果依然使用Transactional会怎样测试正常下多数据源同时插入 简述
在项目本身已经集成MYBatis-PlusMySQL的情况下想要项目支持访问多个数据库。
本文涉及代码已开源
杉极简 java_fir_mybatis_plus_3.5_datasource https://gitee.com/dong-puen/spring-boot-original
项目配置
首先确保你引入多数据源时项目本身已经能访问数据库否则请先完整这一步。 在项目本身已经具备时增加以下配置
pom引入baomidou dependencygroupIdcom.baomidou/groupIdartifactIddynamic-datasource-spring-boot-starter/artifactIdversion4.3.0/version/dependencyyml增加dynamic配置
spring:datasource:dynamic:#设置默认的数据源或者数据源组,默认值即为mysql1primary: mysql1#严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源strict: falsedatasource:mysql1:url: jdbc:mysql://127.0.0.1:13306/test1?useUnicodetrueallowPublicKeyRetrievaltruecharacterEncodingutf-8useSSLfalseserverTimezoneAsia/ShanghaiserverTimezoneGMT%2B8username: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Drivermysql2:url: jdbc:mysql://127.0.0.1:13306/test2?useUnicodetrueallowPublicKeyRetrievaltruecharacterEncodingutf-8useSSLfalseserverTimezoneAsia/ShanghaiserverTimezoneGMT%2B8username: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Driver启动类增加注解
因为我们修改了默认连接数据库的方式所以要排除druid属性默认加载否则将会报错。
SpringBootApplication(exclude DruidDataSourceAutoConfigure.class)配置结束
至此配置方面需要更改的内容已经完成启动项目之后没有报错。则再实现多数据源的调用。
业务调用
注解
此时我们需要了解几个注解
DS()
通常使用该注解访问非主数据源的数据库可以注解到Mapper接口类上。如下所示
DS(mysql2)Transactional
只操作一个数据源。 如下所示对于用户表如果更新数据时发生了异常则回滚本次事物。
DSTransactional
如果一个service方法里面调用两个不同数据源 此时需要DSTransactional注解才能触发事务回滚。
自定义数据源注解MySQL2
现在我们知道将DS(“mysql2”)注解到Mapper层上可以切换数据源查询但是我们应使用一个统一的全局变量来实现。不然之后更改mysql2时就要修改所有涉及的Mapper层。
import com.baomidou.dynamic.datasource.annotation.DS;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/*** 数据源统一注解** author fir*/
DS(mysql2)
Retention(RetentionPolicy.RUNTIME)
Target({ElementType.TYPE, ElementType.METHOD})
public interface MySQL2 {
}此时使用MySQL2注解到Mapper层中就可以达到切换数据源的作用。
测试调用
此时我们的数据库结构如下
查询接口
通过查询接口两个数据库的数据分别被查询出来。
单数据源事务测试 多数据源事务
使用DSTransactional注解后触发异常时数据库的数据会回滚。 如下所示发生异常时插入的数据已经回滚。
如果依然使用Transactional会怎样
而你再使用Transactional就会发现你是使用的主数据源操作的会报错主数据源下没有该数据库表
测试正常下多数据源同时插入
通过另一个接口可以测试到正常的多数据源插入也是可以成功的。