利用 Mybatis-Plus 的动态数据源实现多数据源配置

news2024/11/26 22:45:21

目录

一、导入依赖

二、Application.yaml配置文件

三、切换数据源

四、其他方法

4.1 配置多个数据源

4.2 定义Datasource和EntityManager

4.3 在需要使用数据源的地方注入不同的EntityManager


官网:https://baomidou.com/pages/a61e1b/#dynamic-datasource

一、导入依赖

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

二、Application.yaml配置文件

spring:
  datasource:
    dynamic:
      primary: master #设置默认的数据源或者数据源组,默认值即为master
      strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
      datasource:
        master:
          url: jdbc:mysql://xx.xx.xx.xx:3306/dynamic
          username: root
          password: 123456
          driver-class-name: com.mysql.jdbc.Driver # 3.2.0开始支持SPI可省略此配置
        slave_1:
          url: jdbc:mysql://xx.xx.xx.xx:3307/dynamic
          username: root
          password: 123456
          driver-class-name: com.mysql.jdbc.Driver
        slave_2:
          url: ENC(xxxxx) # 内置加密,使用请查看详细文档
          username: ENC(xxxxx)
          password: ENC(xxxxx)
          driver-class-name: com.mysql.jdbc.Driver
       #......省略
       #以上会配置一个默认库master,一个组slave下有两个子库slave_1,slave_2
       #从库的名称可以自己随便去,但是主库必须为master
       #primary中设置的数据库就是默认访问的数据库
       #当然了,并不一定是主从复制集群才可以这样用,如果业务分成不同的数据库,单纯切换不同数据库也是可以的
# 多主多从                      纯粹多库(记得设置primary)                   混合配置
spring:                               spring:                               spring:
  datasource:                           datasource:                           datasource:
    dynamic:                              dynamic:                              dynamic:
      datasource:                           datasource:                           datasource:
        master_1:                             mysql:                                master:
        master_2:                             oracle:                               slave_1:
        slave_1:                              sqlserver:                            slave_2:
        slave_2:                              postgresql:                           oracle_1:
        slave_3:                              h2:                        

三、切换数据源

默认是使用配置文件中master参数设置的数据库。

但如果我们想使用其他数据源,则可以通过@DS注解来切换数据源。

@DS 可以注解在方法上或类上,同时存在就近原则 方法上注解 优先于 类上注解。 

@Service
@DS("slave")
public class UserServiceImpl implements UserService {

  @Autowired
  private JdbcTemplate jdbcTemplate;

  public List selectAll() {
    return  jdbcTemplate.queryForList("select * from user");
  }
  
  @Override
  @DS("slave_1")
  public List selectByCondition() {
    return  jdbcTemplate.queryForList("select * from user where age >10");
  }
}

四、其他方法

除了使用MybatisPlus的动态数据源,还有很多其他方法,比如shardingsphere等等。

考虑到如果只是简单切换数据源进行crud。其实没必要使用shardingsphere,其使用成本稍微有点高。那么使用mybatisplus的动态数据源,是一个不错的选择!

当然了,这里还提供另一种方法,就是自己来编写数据源配置。

4.1 配置多个数据源

可以通过application.yml或者application.properties文件配置不同的数据源连接信息,例如:

# 数据源1
spring.datasource.primary.url=jdbc:mysql://localhost:3306/primary
spring.datasource.primary.username=root
spring.datasource.primary.password=123456

# 数据源2
spring.datasource.secondary.url=jdbc:mysql://localhost:3306/secondary
spring.datasource.secondary.username=root
spring.datasource.secondary.password=123456

4.2 定义Datasource和EntityManager

@Configuration
public class DataSourceConfig {
    @Bean(name = "primaryDataSource")
    @Qualifier("primaryDataSource")
    @ConfigurationProperties(prefix="spring.datasource.primary")
    public DataSource primaryDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "secondaryDataSource")
    @Qualifier("secondaryDataSource")
    @ConfigurationProperties(prefix="spring.datasource.secondary")
    public DataSource secondaryDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "primaryEntityManager")
    public EntityManager primaryEntityManager(EntityManagerFactoryBuilder builder, @Qualifier("primaryDataSource") DataSource dataSource) {
        return primaryEntityManagerFactory(builder, dataSource).getObject().createEntityManager();
    }

    @Bean(name = "primaryEntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean primaryEntityManagerFactory(EntityManagerFactoryBuilder builder, @Qualifier("primaryDataSource") DataSource dataSource) {
        return builder.dataSource(dataSource).packages("com.example.primary.entity").persistenceUnit("primaryPersistenceUnit").build();
    }

    @Bean(name = "secondaryEntityManager")
    public EntityManager secondaryEntityManager(EntityManagerFactoryBuilder builder, @Qualifier("secondaryDataSource") DataSource dataSource) {
        return secondaryEntityManagerFactory(builder, dataSource).getObject().createEntityManager();
    }

    @Bean(name = "secondaryEntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean secondaryEntityManagerFactory(EntityManagerFactoryBuilder builder, @Qualifier("secondaryDataSource") DataSource dataSource) {
        return builder.dataSource(dataSource).packages("com.example.secondary.entity").persistenceUnit("secondaryPersistenceUnit").build();
    }
}

4.3 在需要使用数据源的地方注入不同的EntityManager

@Repository
public class PrimaryRepository {
    @PersistenceContext(unitName = "primaryPersistenceUnit")
    private EntityManager entityManager;
    
    // ...
}

@Repository

总之,怎么方便怎么习惯怎么来,用什么都可以。

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

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

相关文章

vue2实现路由跳转后隐藏底部固定导航栏Tabber的一种方式

在使用vue路由的时候&#xff0c;跳转到某些页面上是不需要展示底部固定的导航栏的&#xff0c;所以在某些特定的页面跳转时候&#xff0c;就需要隐藏底部的导航栏 这里用了一种方式去解决这个问题 1、前提 这里我把底部导航栏做了一个组件的封装&#xff0c;然后在App.vue里…

玩转 LLMs 之基础设施「利刃出鞘」

LLMs 时代已经到来&#xff0c;这个由 ChatGPT 开始的全球化技术浪潮&#xff0c;所经之处&#xff0c;风起云涌。LLMs 之于当下&#xff0c;更像是 iOS 、Android 之于移动互联网时代。开发者沸腾&#xff0c;投资机构争抢&#xff0c;与赛道相关的基础设施建设自然也成为整个…

IOC容器中的核心容器ApplicationContext

文章目录 1 环境准备2 容器2.1 容器的创建方式2.2 Bean的三种获取方式2.3 容器类层次结构2.4 BeanFactory的使用 前面已经完成bean与依赖注入的相关知识学习&#xff0c;接下来我们主要学习的是IOC容器中的核心容器。 这里所说的核心容器&#xff0c;大家可以把它简单的理解为…

聊聊我在三家IT公司的工作经历,C++程序员都在做什么?

我想分享一些关于C程序员工作的经验。我先自我介绍一下&#xff1a;我是一名毕业于普通985大学的程序员&#xff0c;已经工作了5年&#xff0c;但是我曾在三家互联网公司工作过&#xff0c;这些公司都还算是比较有名的互联网公司。 好了&#xff0c;不多说了&#xff0c;进入正…

真题详解(自顶向下)-软件设计(七十六)

真题详解&#xff08;传引用&#xff09;-软件设计&#xff08;七十五)https://blog.csdn.net/ke1ying/article/details/130695214 计算机软件著作权&#xff0c;正确的是_____。 非法进行拷贝、发布或更改软件的人被称为软件盗版者 循环冗余CRC校验&#xff0c;设数据位为k位…

KVM网络管理-创建桥接网络

KVM网络管理-创建桥接网络 分类 网络&#xff1a; nat isolated 接口&#xff1a; bridge 虚拟交换机&#xff1a; linux-bridge(linux) ovs(open-Vswitch) NAT网络拓扑图 仅主机模式网络拓扑图 桥接模式网络拓扑图 在Linux主机上开启vm1&#xff0c;从交换机上把…

第五章 面向对象-6.内部类

内部类 内部类分为: 成员内部类、静态嵌套类、匿名内部类&#xff08;直接new 抽象类&#xff0c;直接new 接口&#xff09;$1 $2。 如果是函数式接口&#xff0c;可以使用lambda表达&#xff0c;这样可以避免new 接口产生内部匿名类 内部类仍然是一个独立的类&#xff0c;在…

接口测试要测试什么?怎么测?我来告诉你

目录 本文主要分为两个部分&#xff1a; 第一部分&#xff1a; 第二部分&#xff1a; 备注&#xff1a; 本文主要分为两个部分&#xff1a; 第一部分&#xff1a;主要从问题出发&#xff0c;引入接口测试的相关内容并与前端测试进行简单对比&#xff0c;总结两者之前的区别与…

SGI STL(四)——_S_chunk_alloc函数解析

情况一&#xff1a;内存池剩余空间的大小不满足需要分配的内存空间 假设调用为 _S_chunk_alloc(8, 20), 即希望分配8个20B的内存小块构成的chunk块 代码如下 template <bool __threads, int __inst> char* __default_alloc_template<__threads, __inst>::_S_chu…

Ansible 自动化运维工具(二)——Ansible 的脚本(playbook 剧本)

文章目录 一、playbooks 概述以及实例操作1、playbooks 的组成2、操作示例一&#xff1a;3、操作实例二&#xff1a;定义、引用变量4、操作示例三&#xff1a;指定远程主机sudo切换用户5、操作示例四&#xff1a;when条件判断6、操作示例:五&#xff1a;迭代 二、playbook的模块…

怎么把视频压缩变小一点,必须收藏的方法

怎么把视频压缩变小一点&#xff1f;我们发现现在视频在工作中的占比也很大的。当我们拍摄了很多视频后&#xff0c;当然是需要进行后续的编辑和传输啦。但是我们发现视频的进行传输的时候最大的问题就是&#xff0c;视频太大导致无法发送或是发送的时间很慢。现今许多平台都对…

5springboot

SpringBoot 1.SpringBoot是什么 我们知道&#xff0c;从 2002 年开始&#xff0c;Spring 一直在飞速的发展&#xff0c;如今已经成为了在Java EE&#xff08;Java Enterprise Edition&#xff09;开发中真正意义上的标准&#xff0c;但是随着技术的发展&#xff0c;Java EE使…

C++实现图—邻接矩阵,邻接表,深度遍历,广度遍历

目录 1.图的基本概念 2.图的存储结构 2.1邻接矩阵 2.2 邻接表 3.图的遍历 3.1广度优先遍历 3.2图的深度遍历 总结&#xff1a; 1.图的基本概念 图是由顶点集合以及顶点之间的关系组成的一种数据结构&#xff1a;G (V,E),其中顶点集合V{x|x属于某个对象集}是有穷非空集合…

“西湖论剑”四大观察:十年筑梦向未来,数字安全开新局

既有人工智能与安全何去何从的激烈讨论&#xff0c;又有数据安全与数据治理的深度解读&#xff0c;还有数字中国建设背景下安全产业升级的蓝图规划&#xff0c;更有数字安全人才培养的期许与行动……这就是2023 西湖论剑数字安全大会所呈现出的一片热闹景象。 自2012年&#x…

2023全网最全真人总结的常见接口测试面试题,一定不能错过

1、按你的理解&#xff0c;软件接口是什么&#xff1f; 答&#xff1a; 就是指程序中具体负责在不同模块之间传输或接受数据的并做处理的类或者函数。 2、HTTP和HTTPS协议区别&#xff1f; 答&#xff1a; https协议需要到CA&#xff08;Certificate Authority&#xff0c;证书…

理论力学专题:理论力学(物理类)框架

理论力学专题&#xff1a;理论力学&#xff08;物理类&#xff09;框架 拉格朗日方程 虚位移&#xff1a;任意方向的微变化 约束分类&#xff1a; 稳定/不稳定&#xff08;显含时间与否&#xff09;可解/不可解&#xff1a;完整/微分约束&#xff1a; 几何约束&#xff08;完…

F5—创建DDR3内存条DIMM读写测试程序2023-05-16

本文区别于DDR颗粒的配置&#xff0c;记录几个与颗粒配置不同的地方&#xff0c;具体DDR的原理请查看DDR3的应用总结&#xff08;一&#xff09;DDR3的应用总结&#xff08;二&#xff09; 1.确认板卡FPGA型号为xc7k325tffg900 -2&#xff0c;据此创建FPGA工程。 2.添加MIG I…

干货|SPSS方差分析中的简单效应检验(上)

Hello&#xff0c;大家好&#xff01; 这里是壹脑云科研圈&#xff0c;我是喵君姐姐~ 今天和大家分享的是包寒吴霜博士生介绍的 SPSS 方差分析中的简单效应检验系列中的第一部分 —— SPSS 方差分析中的简单效应检验&#xff1a;完整教程。 SPSS 是一个入门级的统计分析软件&…

【论文笔记】数据增强系列.1

本文介绍简单数据增强、好处以及常见的增强方式&#xff0c;也介绍几篇关于数据增强的工作&#xff1a; CutMix&#xff08;ICCV2019&#xff09;&#xff0c;ContrastMask&#xff08;CVPR2022&#xff09;&#xff0c;BCP&#xff08;CVPR2023&#xff09;。 数据增强简介&a…

Nginx缓存优雅清除缓存

1.Nginx缓存 前面我们知道Nginx可以对浏览器缓存进行配置&#xff0c;让一些静态资源缓存到用户本地存储&#xff0c;以提高页面的响应速度&#xff0c;也能降低服务端的压力。浏览器执行缓存的流程如下&#xff1a; 试想一下&#xff0c;如果用户主动清空了本地的浏览器缓存&…