当前位置: 首页 > news >正文

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

听说微信搜索《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: master
      strict: false
      datasource:
        master:
          url: jdbc:mysql://localhost:3306/student
          username: root
          password: 123456
          driver-class-name: com.mysql.jdbc.Driver
        slave:
          url: jdbc:mysql://localhost:3306/books
          username: root
          password: 123456
          driver-class-name: com.mysql.jdbc.Driver

3.4 代码中切换数据源

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

@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");
    }

}

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

(四)完整项目

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

student库中有个student表:

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

books库中有个book表:

CREATE TABLE `book` (
  `ID` int(11) NOT NULL,
  `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接口:

@Mapper
public interface BookMapper {
    @Select("select bookname from book where id=#{id}")
    String getBookNameById(@Param("id") String id);
}

StudentMapper :

@Mapper
public interface StudentMapper {
    @Select("select name from student where id=#{id}")
    String getNameById(@Param("id") String id);
}

然后是一个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,就可以发现两个数据源中的数据都被提取出来了。

(五)总结

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

相关文章:

  • 分享工作一年后收藏的超好用Idea插件,工作效率直接翻倍
  • Activity后台运行一段时间回来crash问题的分析与解决
  • SpringBoot+SpringSecurity实现基于真实数据的授权认证
  • Linux SendMail发送邮件失败诊断案例(三)
  • ElasticSearch究竟是个什么东西
  • 菜鸟学自动化测试(五)-----selenium命令之定位页面元素
  • 软件行业和互联网行业究竟有什么区别?又该如何去选择?
  • 今天打开阿里妈妈惊现 ¥50 元佣金
  • 通过官方文档高效学习ElasticSearch的JavaAPI实现!
  • 如何在自己的项目中引入ElasticSearch搜索引擎?
  • JSON--百度百科
  • 一个双非本科程序员工作一年的经历
  • guava 并发
  • Oauth2是个什么东西?
  • [javaSE] 看知乎学习工厂模式
  • 【391天】每日项目总结系列128(2018.03.03)
  • Bootstrap JS插件Alert源码分析
  • bootstrap创建登录注册页面
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • js面向对象
  • Laravel Telescope:优雅的应用调试工具
  • Laravel 实践之路: 数据库迁移与数据填充
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • magento 货币换算
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • Redis 中的布隆过滤器
  • SQLServer插入数据
  • Xmanager 远程桌面 CentOS 7
  • 闭包,sync使用细节
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 微服务核心架构梳理
  • 系统认识JavaScript正则表达式
  • 小而合理的前端理论:rscss和rsjs
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • ​secrets --- 生成管理密码的安全随机数​
  • !!java web学习笔记(一到五)
  • ###C语言程序设计-----C语言学习(6)#
  • #define,static,const,三种常量的区别
  • (1)SpringCloud 整合Python
  • (20050108)又读《平凡的世界》
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • .FileZilla的使用和主动模式被动模式介绍
  • .NET Core Web APi类库如何内嵌运行?
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .NET Remoting学习笔记(三)信道
  • .NET中GET与SET的用法
  • .Net中的设计模式——Factory Method模式
  • ??在JSP中,java和JavaScript如何交互?