Spring配置动态数据库

news2024/12/23 14:03:08

前言

本文主要介绍使用spring boot 配置多个数据库,即动态数据库

开始搭建

首先创建一个SpringWeb项目——dynamicdb(spring-boot2.5.7)

然后引入相关依赖lombok、swagger2、mybatis-plus,如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.7</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>dynamicdb</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>dynamicdb</name>
    <description>dynamicdb</description>
    <properties>
        <java.version>8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
​
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.28</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.9.2</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.9.2</version>
        </dependency>
 
        <!-- mybatis-plus 依赖 -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.2</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- sqlSessionTemplate 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- spring-boot dynamic 动态数据库依赖-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>2.5.6</version>
</dependency>
<!-- druid 动态简易使用依赖 @DS("db1")-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.20</version>
</dependency>  
</dependencies>
​
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
​
</project>

然后在包dynamicdb下面创建controller、mapper、dbmodel, 然后在resource下面创建mapper文件夹及问题,如下图:

然后配置application,启用swagger2和添加mapper扫描,如下:

@EnableSwagger2
@Log4j2
@SpringBootApplication 
@MapperScan("com.example.dynamicdb.mapper")
public class DynamicdbApplication {
​
    public static void main(String[] args) {
        SpringApplication.run(DynamicdbApplication.class, args);
    }
}

然后编辑resources下的application.yml,如下:

server:
  port: 8082
  servlet:
    context-path: /api
spring:
  servlet:
    multipart:
      max-file-size: 50MB
      max-request-size: 50MB
  datasource:
    dynamic: #使用动态数据库配置
      primary: db1 # 配置默认数据库
      datasource:
        db1: # 数据源1
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://localhost/db1
          username: root
          password: 1qaz!QAZ
        db2: # 数据源2
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://localhost/db2
          username: root
          password: 1qaz!QAZ
      druid:
        initial-size: 1
        max-active: 20
        min-idle: 1
        max-wait: 60000
  autoconfigure:
    exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure # 去除druid配置 
mybatis-plus:
  mapper-locations: classpath:mapper/*.xml #指定resources下的mapper文件夹下是存储映射XML的文件夹

然后创建SqlSessionController,使用SqlSession来加载Mapper,代码如下:

@RestController
public class SqlSessionController {
​
​
    @Autowired
    private SqlSession sqlSession;
​
    @GetMapping(value = "/SqlSession/normalSql")
    @ResponseBody
    @ApiOperation(value = "默认查询,从主数据库查询", notes = "当前配置的主数据是db1-primary: db1")
    public List<user> normalSql() {
        //读取第一个数据库的值
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<user> users = mapper.test();
        return users;
    }
    @GetMapping(value = "/SqlSession/data_from_db1")
    @ResponseBody
    @DS("db1")
    @ApiOperation(value = "从db1数据库查询数据", notes = "查询db1")
    public List<user> data_from_db1() {
        //读取第一个数据库的值
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<user> users = mapper.test();
        return users;
    }
​
    @GetMapping(value = "/SqlSession/data_from_db2")
    @ResponseBody
    @DS("db2")
    @ApiOperation(value = "从db2数据库查询数据", notes = "查询db2")
    public List<user> data_from_db2(Integer id) {
        //读取第二个数据库的值
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<user> users = mapper.test();
        return users;
    }
}

代码中使用 @DS("db1")来指定该接口内使用的数据库。

再创建一个MapperController,测试使用Mapper直接访问数据库,如下

@RestController
public class MapperController {
​
    @Autowired
    private UserMapper userMapper;
​
    @GetMapping(value = "/Mapper/normalSql")
    @ResponseBody
    @ApiOperation(value = "使用Mapper查询,从主数据库查询", notes = "当前配置的主数据是db1-primary: db1")
    public List<user> normalSql() {
        //读取第一个数据库的值
        List<user> users = userMapper.test();
        return users;
    }
}

----------------------------------------------------------------------------------------------------

到此,Spring配置动态数据库就已经介绍完了。

代码已经传到Github上了,欢迎大家下载。

Github地址:https://github.com/kiba518/dynamicdb

----------------------------------------------------------------------------------------------------

注:此文章为原创,任何形式的转载都请联系作者获得授权并注明出处!
若您觉得这篇文章还不错,请点击下方的【推荐】,非常感谢!

https://www.cnblogs.com/kiba/p/17473450.html

 

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

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

相关文章

【编码魔法师系列_六大原则1】单一职责原则(Single Responsibility Principle)

学会设计模式&#xff0c;你就可以像拥有魔法一样&#xff0c;在开发过程中解决一些复杂的问题。设计模式是由经验丰富的开发者们&#xff08;GoF&#xff09;凝聚出来的最佳实践&#xff0c;可以提高代码的可读性、可维护性和可重用性&#xff0c;从而让我们的开发效率更高。通…

ABAP: NUMBER_GET_NEXT用法

NUMBER_GET_NEXT 是用来自动获取编号的方法。 1、SNRO : 创建编号范围对象&#xff0c;例如&#xff0c;ZTEST_001 点击间隔编辑&#xff0c;可以设置编号范围&#xff0c;如下图所示。 2、SE11: 自定义设置编号长度域&#xff0c;例如&#xff0c;ZTEST_NUM 3、程序里面调用N…

自动驾驶——基于五次多项式螺旋线方程的换道曲线规划

1.BackGround 已知&#xff1a;换道初始纵坐标y0&#xff08;横向距离&#xff09;&#xff0c;换道初始航向角tan0&#xff0c;换道时间t&#xff0c;换道结束纵坐标yf&#xff0c;换道结束航向角tanf&#xff0c;车速VehSpd&#xff0c;曲线中点曲率q且曲率变化率为0。求解期…

python:tkinter图形界面通讯录+txt文本存储数据

1 实验目的与要求 实验目的&#xff1a;设计一个实用的小型通讯录程序 实验要求&#xff1a;最后的通讯录要写入文件中保存起来 2 实验内容 本次实验内容如下&#xff1a; 设计一个实用的小型通讯录程序&#xff0c;具有添加&#xff0c;查询和删除功能。由姓名&#xff0…

jmeter008:结婚fiddler查看结果

如果通过jmeter的(察看结果树)查看响应数据不完整时&#xff0c; 可以结合fiddler来查看请求数据&#xff0c; 方法如下&#xff1a; 在请求的(高级)填写本地ip&#xff0c; 端口号&#xff0c;打开fiddler&#xff0c;运行jmeter请求即可抓包

【新版】系统架构设计师 - 计算机网络

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 架构 - 计算机网络 考点摘要 TCP/IP协议族&#xff08;★★★★&#xff09; 网路规划与设计&#xff08;★★★★&#xff09; 组网技术&#xff08;★&#xff09; 网络存储&#xff08;★&#xff09; IPv…

LabVIEW开发经济高效的多轴运动控制

LabVIEW开发经济高效的多轴运动控制 使用PC并行端口到驱动器电路接口技术开发的&#xff0c;该技术消除了在PC内部安装昂贵的插入式运动控制板的要求。为所介绍的系统开发了PC到电机接口和驱动器电路板。该系统能够使用直流电机控制四轴运动或使用步进电机控制两轴运动。 运动…

chatgpt赋能Python-python怎么在程序环境中保存

介绍 Python是一个广泛应用于各种领域的高级编程语言&#xff0c;它具有易于学习、可读性强、支持多种编程范式、强大且丰富的库、较高的运行速度等众多优点。无论是数据科学、人工智能、Web开发、自动化测试、游戏开发等领域&#xff0c;Python都是优秀的选择。 然而&#x…

GPDB中Latch等待与唤醒实现机制

GPDB中Latch等待与唤醒实现机制 GreenPlum/PostgreSQL中有很多Latch以帮助多进程以及主线程与从线程之间协作。那么Latch是如何实现的呢&#xff1f;Latch可以在多进程之间以及主线程和从线程之间实现等待与唤醒&#xff0c;WaitEventSet是实现这项功能的关键结构。本文我们聊聊…

基于SpringBoot+Vue的平时成绩管理系统

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 在现代教育环境中&…

2023全新微信公众号无限回调系统源码 亲测可用

2023年微信公众号无限回调全新升级&#xff0c;无限回调系统功能更强大&#xff0c;现已对接易支付&#xff0c;支持用户自助充值、购买授权、更换授权和续费授权。此次升级还增加了多项实用性功能&#xff0c;为公众号运营者提供更好的服务和支持。

使用Python中的Pandas工具将多个CSV格式的数据文件合并为一个

文章目录 使用软件安装Pandas工具编写py程序运行程序注意事项 使用软件 Pycharm 2020.1 安装Pandas工具 执行命令&#xff1a;pip install pandas 编写py程序 path&#xff1a;文件所处路径 import pandas as pd import os# 指定多个csv文件所在的目录 csv_dir path# 获…

LinkedHashSet源码

介绍 LinkedHashSet是HashSet的子类 LinkedHashSet底层是一个LinkedHashMap&#xff0c;底层维护了一个数组双向链表 LinkedHashSet根据元素的hashCOde值来决定元素的存储位置&#xff0c;同时使用链表维护元素的次序&#xff0c;这使元素看起来以插入顺序保存的 LinkedHas…

辅助驾驶功能开发-功能规范篇(27)-导航辅助驾驶NAP-微避障策略

1.微避障策略功能概述 微避障策略是在NAP功能激活过程中,当邻车道有大型车辆时(卡车、公交车、大巴等)或小车压线或左右侧靠近路沿时,控制本车进行横向偏移,达到远离目标车或路沿的效果。本文分别对大型车辆偏移、小车压线偏移、路沿偏移、Merge处理和偏移规划这五个部分展…

华为OD机试真题 JavaScript 实现【不爱施肥的小布】【2023Q1 100分】

一、题目描述 某农村主管理了一大片果园&#xff0c;fields[i]表示不同国林的面积&#xff0c;单位m2&#xff0c;现在要为所有的果林施肥且必须在n天之内完成&#xff0c;否则影响收成。小布是国林的工作人员&#xff0c;他每次选择一片果林进行施肥&#xff0c;且一片国林施…

Reinforce算法原理及Tensorflow代码实现

Q-learning和DQN算法都是强化学习中的Value-based的方法&#xff0c;它们都是先经过Q值来选择动作。强化学习中还有另一大类是策略梯度方法&#xff08;Policy Gradient Methods&#xff09;。Policy Gradient 是一类直接针对期望回报&#xff08;Expected Return&#xff09;通…

电气火灾监控系统如何有效的预防木材加工企业电气火灾隐患

摘要&#xff1a;本文分析了木材加工企业的特点、现状及常见电气火灾隐患&#xff0c;提出了消灭电气火灾隐患的措施。结尾介绍了木材加工企业常用电气设备的选用及电气火灾监控系统在其低压配电系统的应用方案及产品选型。 关键词&#xff1a;木材加工企业&#xff1b;电气火…

网络服务——DHCP服务

个人简介&#xff1a;云计算网络运维专业人员&#xff0c;了解运维知识&#xff0c;掌握TCP/IP协议&#xff0c;每天分享网络运维知识与技能。座右铭&#xff1a;海不辞水&#xff0c;故能成其大&#xff1b;山不辞石&#xff0c;故能成其高。 个人主页&#xff1a;小李会科技的…

我和老刘又被搞惨了

前两天在调试PHY的时候遇到了一堆问题&#xff0c;老刘都不耐其烦的搞定了&#xff0c;这次我们开始调试音频部分&#xff0c;音频部分很简单&#xff0c;无非就是录音&#xff0c;要是能把录音的音频拿到了&#xff0c;那就万事大吉了。老刘也是信心满满&#xff0c;老刘对我说…

操作系统性能提升之内核锁优化

性能为王&#xff0c;系统的性能提升是每一个工程师的追求。目前&#xff0c;性能优化主要集中在消除系统软件堆栈中的低效率上或绕过高开销的系统操作。例如&#xff0c;内核旁路通过在用户空间中移动多个操作来实现这个目标&#xff0c;还有就是为某些类别的应用程序重构底层…