SpringBoot快速集成多数据源(自动版)

news2024/11/28 11:50:18
有些人因为看见所以相信,有些人因为相信所以看见

有目录,不迷路

  • 前期准备
  • 实现
  • 演示
  • 参考

最近研究了一下多数据源,这篇博客讲的是简单模式,下篇博客预计写自动切换模式

前期准备

本篇博客基于SpringBoot整合MyBatis-plus,如果有不懂这个的,
可以查看我的这篇博客:快速CRUD的秘诀之SpringBoot整合MyBatis-Plus

为了实现效果,先在本地的mysql库里面创建两个数据库:
在这里插入图片描述
然后在两个数据库里面,分别创建同样的users表,但是插入不同的数据,
mydb的数据:
在这里插入图片描述
mydb2的数据:
在这里插入图片描述

实现

1.在pom.xml中引入多数据源的依赖dynamic-datasource-spring-boot-starter

<!-- 多数据切换所需依赖 -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
    <version>3.0.0</version>
</dependency>

2.在application.yml配置文件中配置多数据源:

sever:
  # 端口
  port: 8080

# 配置数据源
spring:
  datasource:
    dynamic:
      primary: master #设置默认的数据源或者数据源组,默认值即为master
      strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
      datasource:
        master:
          # 数据库路径jdbc:mysql://localhost:3306/mydb 的缩写,并配置时区
          url: jdbc:mysql:///mydb?serverTimezone=GMT%2B8
          username: root
          password: 123456
          driver-class-name: com.mysql.cj.jdbc.Driver # 3.2.0开始支持SPI可省略此配置
        slave:
          url: jdbc:mysql:///mydb2?serverTimezone=GMT%2B8
          username: root
          password: 123456
          driver-class-name: com.mysql.cj.jdbc.Driver

# 打印MyBatis SQL 日志
logging:
  level:
    com.guqueyue.test.dao: debug # 写接口的包名

注意:

  1. 这里数据源的名字可以自定义,什么masterslave都可以随意命名。
  2. 这里可以根据格式自行添加数据源的个数,并且支持多种数据库,如oracle达梦等。此处为了演示方便,都使用了mysql数据库。

3.编写代码
3.1.在持久层中查找users表的数据,并使用 @DS注解,切换数据源:

package com.guqueyue.test.dao;

import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.guqueyue.test.entity.User;
import org.apache.ibatis.annotations.Select;

import java.util.List;

/**
 * @Author: guqueyue
 * @Description: 映射接口UserMapper
 * @Date: 2023/12/19
 **/
public interface UserMapper extends BaseMapper<User> {

    @DS("master") // 默认为主数据源,其实可以省略
    @Select("select * from users")
    List<User> selectUserList();

    @DS("slave") // 切换为slave数据源
    @Select("select * from users")
    List<User> selectUserListBySlave();

}

注意:

  1. @DS注解不止可以用在持久层,可以用在任意的类和方法上。
  2. @DS注解作用在方法上的优先级 > 类。

也就是说可以在类上加一个@DS注解默认一个该类的数据源,如 @DS("master")
再在具体的方法上加一个@DS注解做个性化指定,如 @DS("slave"),效果等同:

/**
 * @Author: guqueyue
 * @Description: 映射接口UserMapper
 * @Date: 2023/12/19
 **/
@DS("master") // 默认为主数据源,其实可以省略
public interface UserMapper extends BaseMapper<User> {
    
    @Select("select * from users")
    List<User> selectUserList();

    @DS("slave") // 切换为slave数据源
    @Select("select * from users")
    List<User> selectUserListBySlave();

}

3.2.创建service接口:

package com.guqueyue.test.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.guqueyue.test.entity.User;

import java.util.List;

/**
 * @Author: guqueyue
 * @Description: 用户service接口
 * @Date: 2023/12/19
 **/
public interface IUserService extends IService<User> {

    List<User> selectUserList(String type);
}

3.3.创建service实现类,并调用持久层接口,根据传入的参数切换不同的方法:

package com.guqueyue.test.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.guqueyue.test.dao.UserMapper;
import com.guqueyue.test.entity.User;
import com.guqueyue.test.service.IUserService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

/**
 * @Author: guqueyue
 * @Description: 用户实现类
 * @Date: 2023/12/19
 **/
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {

    @Resource
    private UserMapper userMapper;

    @Override
    public List<User> selectUserList(String type) {

		 // do something: 此处可根据实际情况进行业务选择,如根据当前登录的用户信息来选择不同的数据库
        // 此处为了方便演示,直接用前端传入的type来判断

        return "slave".equals(type) ? userMapper.selectUserListBySlave()
                                    : userMapper.selectUserList();
    }
}

3.4.编写控制层代码:

package com.guqueyue.test.controller;

import com.guqueyue.test.entity.User;
import com.guqueyue.test.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * @Author: guqueyue
 * @Description: 用户控制层
 * @Date: 2023/12/19
 **/
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private IUserService userService;

    /**
     * 查询用户列表
     * @return
     */
    @RequestMapping("/list")
    public List<User> userList(String type) {
        System.out.println("接收到的数据源类型为:" + type);

        return userService.selectUserList(type);
    }
}

演示

代码编写好了,我们就可以启动项目了:
在这里插入图片描述
控制台显示项目启动成功后,
在浏览器输入:http://localhost:8080/user/list?type=master,返回:
在这里插入图片描述
在浏览器输入:http://localhost:8080/user/list?type=slave,则返回:
在这里插入图片描述
功能实现。

参考

具体实现可以参考官方文档:多数据源

完结撒花!!!
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1348943.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IBM介绍?

IBM&#xff0c;全名国际商业机器公司&#xff08;International Business Machines Corporation&#xff09;&#xff0c;是一家全球知名的美国科技公司。它成立于1911年&#xff0c;总部位于美国纽约州阿蒙克市&#xff08;Armonk&#xff09;&#xff0c;是世界上最大的信息…

通过国家网络风险管理方法提供安全的网络环境

印度尼西亚通过讨论网络安全法草案启动了其战略举措。不过&#xff0c;政府和议会尚未就该法案的多项内容达成一致。另一方面&#xff0c;制定战略性、全面的网络安全方法的紧迫性从未像今天这样重要。 其政府官方网站遭受了多起网络攻击&#xff0c;引发了人们对国家网络安全…

PiflowX组件-JDBCWrite

JDBCWrite组件 组件说明 使用JDBC驱动向任意类型的关系型数据库写入数据。 计算引擎 flink 有界性 Sink: Batch Sink: Streaming Append & Upsert Mode 组件分组 Jdbc 端口 Inport&#xff1a;默认端口 outport&#xff1a;默认端口 组件属性 名称展示名称默…

ES应用_ES原理

1 ES简介 Elasticsearch&#xff1a;基于Apache Lucene并使用Java开发的分布式开源搜索和分析引擎。是 Elastic Stack 的核心&#xff0c;它集中存储您的数据。 Elastic Stack&#xff1a;包括 Elasticsearch、Logstash 、 Kibana 和Beats &#xff08;也称为 ELK Stack&…

简写英语单词

题目&#xff1a; 思路&#xff1a; 这段代码的主要思路是读取一个字符串&#xff0c;然后将其中每个单词的首字母大写输出。具体来说&#xff0c;程序首先使用 fgets 函数读取一个字符串&#xff0c;然后遍历该字符串中的每个字符。当程序遇到一个字母时&#xff0c;如果此时…

Git使用教程 gittutorial

该教程对该文章的翻译&#xff1a;https://git-scm.com/docs/gittutorial 本文介绍怎用使用 Git 导入新的工程、修改文件及如何其他人同步开发。 首先&#xff0c; 可以使用以下指令获取文档帮助 git help log笔者注&#xff1a;不建议看这个文档&#xff0c;标准的语法介绍…

Yapi接口管理平台Centos7容器部署

文章目录 0.Docker部署1.Docker部署1.1 MongoDB1.2 下载 Yapi 镜像1.3 初始化数据库1.4 启动 Yapi 服务1.5 访问 Yapi 2.docker-compose部署2.1 创建容器网络2.2 创建2.3 创建 mongodb-compose2.4 创建 yapi-compose2.5 启动容器2.6 访问 Yapi 0.Docker部署 参考&#xff1a;C…

modelsim安装使用

目录 modelsim 简介 modelsim 简介 ModelSim 是三大仿真器公司之一mentor的产品&#xff0c;他可以模拟行为、RTL 和门级代码 - 通过独立于平台的编译提高设计质量和调试效率。单内核模拟器技术可在一种设计中透明地混合 VHDL 和 Verilog&#xff0c;常用在fpga 的仿真中。 #…

回溯法解决工作分派问题

解决这个问题的关键有两个: 1.t数组用来在回溯过程暂时存储工作分配关系 2.ans数组用来保存最终答案 3."恢复现场"操作 4.一维数组st,表示该工作是否已经被选 5.solve第k层递归表示第k个人,for循环罗列的是工作.这样,比k表示工作,for循环枚举人更加符合我们的直…

常见位运算模板方法总结(包含五道例题)

哈喽大家好&#xff0c;今天博主给大家带来算法基础常见位运算的模板&#xff0c;可以说大家遇到的百分之九十与位运算有关的题都可以用得上。话不多上我们上干货&#xff1a; 一.基础位运算符 << 左移运算符 >> 右移运算符 ~ 取反 & 与运算 | …

23种设计模式Python版

目录 创建型模式简单工厂模式工厂方法模式抽象工厂模式单例模式原型模式建造者模式 结构型模式适配器模式桥接模式组合模式装饰器模式外观模式享元模式代理模式 行为型模式职责链模式命令模式解释器模式迭代器模式中介者模式备忘录模式观察者模式状态模式策略模式模板方法模式访…

CUMT--Java复习--核心类

目录 一、装箱与拆箱 二、“”与equals 三、字符串类 1、String、StringBuffer、StringBuilder的区别 2、String类 3、StringBuffer类 4、StringBuilder类 四、类与类之间关系 一、装箱与拆箱 基本类型与对应封装类之间能够自动进行转换&#xff0c;本质就是Java的自…

【力扣题解】P105-从前序与中序遍历序列构造二叉树-Java题解

&#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【力扣题解】 文章目录 【力扣题解】P105-从前序与中序遍历序列构造二叉树-Java题解&#x1f30f;题目描述&#x1f4a1;题…

论文速递|Management Science 11月文章合集(下)

添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 编者按 在本系列文章中&#xff0c;我们梳理了运筹学顶刊Management Science11月份发布的47篇文章的基本信息&#xff0c;旨在帮助读者快速洞察行业最新动态。本文为第三部分。 文章1 ● 题目&#xff1a;…

Linux:apache优化(7)—— 访问控制

作用&#xff1a;为apache服务提供的页面设置客户端访问权限&#xff0c;为某个组或者某个用户加密访问&#xff1b; /usr/local/httpd/bin/htpasswd -c /usr/local/httpd/conf/htpasswd tarro1 #添加admin用户&#xff0c;可以在两个路径中间添加-c是新建文件删除原文件&#…

当你的电脑在安装Windows更新后出现问题时怎么办,这里提供办法

Windows更新通常会为你的电脑带来错误修复、安全补丁和新功能,但它们也可能会带来性能下降甚至引发恐慌的数据丢失等问题,从而适得其反。如果你在安装更新后发现了一些奇怪之处,你可以将其回滚,尝试重新启动。 Windows更新主要有两种:质量更新和功能更新。高质量的更新包…

16.综合项目实战

一、基础演练&#xff1a; 1、建库、建表 # 创建数据库 create database mysql_exampleTest; use mysql_exampleTest; # 学生表 CREATE TABLE Student( s_id VARCHAR(20), s_name VARCHAR(20) NOT NULL DEFAULT , s_birth VARCHAR(20) NOT NULL DEFAULT , s_sex VARC…

RocketMQ(Linux版本5.1.4)

1、停止之前的运行服务 [roottssvr1-c1 rocketmq-all-4.7.0-bin-release]# sh bin/mqshutdown namesrv No mqnamesrv running. [roottssvr1-c1 rocketmq-all-4.7.0-bin-release]# [roottssvr1-c1 rocketmq-all-4.7.0-bin-release]# [roottssvr1-c1 rocketmq-all-4.7.0-bin-r…

【编译原理】期末预习做题向I

新的一年希望可以成为更好的人嘿嘿&#xff01; 这一篇基本就是把 up 讲的题都截了一遍然后加了点自己的笔记啥的 O.o &#xff08;不妥的话会删掉的 qwq&#xff0c;希望没事嘿嘿&#xff09; 来源&#xff1a;混子速成 I. 绪论 记住组成部分 II. 前后无关文法和语言 1.…

[C#]OpenCvSharp结合yolov8-face实现L2CS-Net眼睛注视方向估计或者人脸朝向估计

源码地址&#xff1a; github地址&#xff1a;https://github.com/Ahmednull/L2CS-Net L2CS-Net介绍&#xff1a; 眼睛注视&#xff08;eye gaze&#xff09; 是在各种应用中使用的基本线索之一。 它表示用户在人机交互和开放对话系统中的参与程度。此外&#xff0c;它还被用…