seo网站建设优化wordpress如何实现精确查询
文章目录
- 简述
 - 本文涉及代码已开源
 
- 项目配置
 - pom引入baomidou
 - yml增加dynamic配置
 - 启动类增加注解
 - 配置结束
 
- 业务调用
 - 注解
 - @DS()
 - @Transactional
 - @DSTransactional
 - 自定义数据源注解@MySQL2
 
- 测试调用
 - 查询接口
 - 单数据源事务测试
 - 多数据源事务
 - 如果依然使用@Transactional会怎样?
 - 测试正常下多数据源同时插入
 
简述
在项目本身已经集成MYBatis-Plus+MySQL的情况下,想要项目支持访问多个数据库。
本文涉及代码已开源
杉极简
 java_fir_mybatis_plus_3.5_datasource
 https://gitee.com/dong-puen/spring-boot-original
项目配置
首先,确保你引入多数据源时,项目本身已经能访问数据库,否则请先完整这一步。
 在项目本身已经具备时,增加以下配置
pom引入baomidou
        <dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>4.3.0</version></dependency>
 
yml增加dynamic配置
spring:datasource:dynamic:#设置默认的数据源或者数据源组,默认值即为mysql1primary: mysql1#严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源strict: falsedatasource:mysql1:url: jdbc:mysql://127.0.0.1:13306/test1?useUnicode=true&allowPublicKeyRetrieval=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&serverTimezone=GMT%2B8username: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Drivermysql2:url: jdbc:mysql://127.0.0.1:13306/test2?useUnicode=true&allowPublicKeyRetrieval=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&serverTimezone=GMT%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就会发现,你是使用的主数据源操作的,会报错,主数据源下,没有该数据库表
 
测试正常下多数据源同时插入
通过另一个接口,可以测试到,正常的多数据源插入也是可以成功的。
 
 
 
