想在一个项目中实现多数据源切换?几行代码就搞定了

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 在实际的应用场景中,我们经常会遇到一个系统要调用多个数据源的情况。可能是同一个mysql的不同库,也有可能是从不同的mysql中调用数据进行使用。这里提供一种十分高效的多数据源切换框架---dynamicdatasource

听说微信搜索《Java鱼仔》会变更强!


本文收录于JavaStarter ,里面有我完整的Java系列文章,学习或面试都可以看看哦


(一)场景


在实际的应用场景中,我们经常会遇到一个系统要调用多个数据源的情况。可能是同一个mysql的不同库,也有可能是从不同的mysql中调用数据进行使用。这里提供一种十分高效的多数据源切换框架---dynamicdatasource


(二)介绍一下这个框架


dynamicdatasource其实是Mybatis-plus生态圈中的其中一个框架,来自码云知名开源项目 Mybatis-Plus 运营组织,这个组织还有个奇怪的名字叫做苞米豆。这是个挺有传奇色彩的组织,大家有兴趣可以了解一下。


(三)开始使用


3.1 搭建项目


这一步就不需要多提了,搭建一个Springboot项目即可,引入基础的web依赖。


3.2 引入依赖


动态数据源的核心依赖是下面这个:


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

我们自己再引入JDBC三件套

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><!--https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.3</version></dependency>

3.3 配置文件编写


在以前使用Mybatis的时候,我们只能配置一个数据源,现在可以通过动态数据源的方式配置多个数据源。


其中primary表示默认的数据源,strict表示设置严格模式,默认false不启动. 启动后在未匹配到指定数据源时候会抛出异常,不启动则使用默认数据源。


spring:
datasource:
dynamic:
primary: masterstrict: falsedatasource:
master:
url: jdbc:mysql://localhost:3306/studentusername: rootpassword: 123456driver-class-name: com.mysql.jdbc.Driverslave:
url: jdbc:mysql://localhost:3306/booksusername: rootpassword: 123456driver-class-name: com.mysql.jdbc.Driver

3.4 代码中切换数据源


通过一个注解就可以轻松切换数据源:


@Service@DS("master")
publicclassTestService {
@Autowired(required=false)
privateBookMapperbookMapper;
@Autowired(required=false)
privateStudentMapperstudentMapper;
publicStringgetName(){
returnstudentMapper.getNameById("1");
    }
@DS("slave")
publicStringgetBookName(){
returnbookMapper.getBookNameById("1");
    }
}

首先,我们可以给一个方法设置数据源,在内部的方法中也可以通过DS注解切换数据源,不用担心嵌套的问题。


(四)完整项目


首先我建了两个库,一个叫student、另一个叫books

student库中有个student表:


CREATETABLE `student` (  `id` int(4)NOTNULL AUTO_INCREMENT,  `name` varchar(10)NOTNULL,  `grade` int(4) DEFAULT NULL,  PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;

books库中有个book表:

CREATETABLE `book` (  `ID` int(11)NOTNULL,  `BOOKISBN` varchar(255) DEFAULT NULL,  `BOOKNAME` varchar(255) DEFAULT NULL,  `AUTHOR` varchar(255) DEFAULT NULL,  `PRICE` double DEFAULT NULL,  `TYPEID` int(11) DEFAULT NULL,  `PUBLISHER` varchar(255) DEFAULT NULL,  PRIMARY KEY (`ID`)) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

项目结构很简单:


网络异常,图片无法展示
|


首先是两个Mapper接口:

@MapperpublicinterfaceBookMapper {
@Select("select bookname from book where id=#{id}")
StringgetBookNameById(@Param("id") Stringid);
}

StudentMapper :

@MapperpublicinterfaceStudentMapper {
@Select("select name from student where id=#{id}")
StringgetNameById(@Param("id") Stringid);
}

然后是一个service

@Service
@DS("master")public class TestService {    @Autowired(required =false)    private BookMapper bookMapper;    @Autowired(required =false)    private StudentMapper studentMapper;    public String getName(){        return studentMapper.getNameById("1");}    @DS("slave")    public String getBookName(){        return bookMapper.getBookNameById("1");}}

然后是一个service

@Service
@DS("master")public class TestService {    @Autowired(required =false)    private BookMapper bookMapper;    @Autowired(required =false)    private StudentMapper studentMapper;    public String getName(){        return studentMapper.getNameById("1");}    @DS("slave")    public String getBookName(){        return bookMapper.getBookNameById("1");}}

最后controller调用一下Service

@RestController
public class IndexController {    @Autowired
    private TestService testService;    @GetMapping("index")    public String index(){        String studentName = testService.getName();        String bookName = testService.getBookName();        return studentName+bookName;}}

启动类中扫描一下Mapper

@SpringBootApplication
@MapperScan("com.javayz.mybatisplus.mapper")public class MybatisplusApplication {    public static void main(String[] args){        SpringApplication.run(MybatisplusApplication.class, args);}}


这样一个简单的项目就搭建完成了,访问一下/index,就可以发现两个数据源中的数据都被提取出来了。


(五)总结


如果你的项目中有类似的需求,不妨尝试一下这种方式。如果没有这样的需求,对这项技术混个眼熟也好。我是鱼仔,我们下期再见!

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
负载均衡 算法 druid
【Java多数据源实现教程】实现动态数据源、多数据源切换方式(下)
【Java多数据源实现教程】实现动态数据源、多数据源切换方式(下)
800 0
|
Java Spring
仿写@DS 多数据源动态切换
最近公司在做项目,用到了多数据源,我在网上找了好多的开源项目。
仿写@DS 多数据源动态切换
|
20天前
|
监控 Java 数据库
SpringBoot 实现动态切换数据源:优雅之道
在微服务架构和复杂的应用系统中,随着业务规模的扩大,单个数据源往往无法满足多样化的数据访问需求。这时,动态切换数据源成为了一个重要的技术需求,它允许应用程序在运行时根据业务逻辑或用户请求,灵活地选择不同的数据源进行操作。在Spring Boot框架中,实现数据源的动态切换既是一项挑战,也是一项展现技术优雅性的机会。以下,我们将深入探讨如何在Spring Boot中实现数据源的动态切换,并追求实现的优雅性。
90 1
|
5月前
|
JavaScript 关系型数据库 MySQL
若依框架数据源切换为pg库
若依管理系统切换数据源为pg数据库
若依框架数据源切换为pg库
|
5月前
|
存储 Java 关系型数据库
springboot整合多数据源的配置以及动态切换数据源,注解切换数据源
springboot整合多数据源的配置以及动态切换数据源,注解切换数据源
428 0
|
Java 数据库
SSM 最简单的实现操作 多数据源&动态切换
SSM 最简单的实现操作 多数据源&动态切换
238 0
SSM 最简单的实现操作 多数据源&动态切换
|
存储 Java 中间件
【Java多数据源实现教程】实现动态数据源、多数据源切换方式(上)
【Java多数据源实现教程】实现动态数据源、多数据源切换方式(上)
843 0
【Java多数据源实现教程】实现动态数据源、多数据源切换方式(上)
|
SQL druid Java
基于springboot+jpa 实现多租户动态切换多数据源 - 使用Flyway实现多数据源数据库脚本管理和迭代更新
基于springboot+jpa 实现多租户动态切换多数据源 - 使用Flyway实现多数据源数据库脚本管理和迭代更新
1604 0
基于springboot+jpa 实现多租户动态切换多数据源 - 使用Flyway实现多数据源数据库脚本管理和迭代更新
|
XML Java 数据库
SpringBoot多数据源切换(十二)
SpringBoot多数据源切换(十二)
159 0
SpringBoot多数据源切换(十二)
|
Java 数据库 Spring
springboot切换数据源
springboot切换数据源
139 0