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

1、SpringBoo中Mybatis多数据源动态切换

我们以一个实例来详细说明一下如何在SpringBoot中动态切换MyBatis的数据源。

一、需求

1、用户可以界面新增数据源相关信息,提交后,保存到数据库

2、保存后的数据源需要动态生效,并且可以由用户动态切换选择使用哪个数据源

3、数据库保存了多个数据源的相关记录后,要求在系统启动时把这些个数据源创建出来,用户在使用时可以自由选择切换

二、项目准备

创建项目的基础骨架

建项目

项目名:dds

改pom

<?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>3.3.5</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.xiaoxie</groupId>
    <artifactId>dds</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>dds</name>
    <description>dds</description>
    <properties>
        <java.version>17</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>3.0.3</version>
        </dependency>

        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.8</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter-test</artifactId>
            <version>3.0.3</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

修改yml

server:
  port: 8888

spring:
  datasource:
    druid:
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://127.0.0.1:3306/dds?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
      username: root
      password: root


mybatis:
  mapper-locations: classpath:mapper/**.xml
  configuration:
    map-underscore-to-camel-case: true

主启动类

@SpringBootApplication
public class DdsApplication {

    public static void main(String[] args) {
        SpringApplication.run(DdsApplication.class, args);
    }

}

做完成上面就是不带任何业务类的一个基础项目框架。

数据库准备

新增一个数据库dds,其中有两个数据表,一个是用来存储用户提交的数据源信息的(ds),一个是后续我们测试效果用的(test)。

CREATE TABLE `ds` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
  `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '数据源名称',
  `url` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'url',
  `username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'username',
  `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'password',
  `create_time` datetime NOT NULL COMMENT '创建时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;



CREATE TABLE `test` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

INSERT INTO `dds`.`test` (`id`, `name`) VALUES (1, '王二麻子');

新增一个测试库test,其中有一个测试数据表,这个表的结构保持与dds库中的test表一致,但数据不一样。

CREATE TABLE `test` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

INSERT INTO `test`.`test` (`id`, `name`) VALUES (1, '张三');

三、处理与前端的交互

后端接口

新增一个Controller类,这个类中添加一个处理器方法:AddSourceController

@Controller
@Slf4j
@RequiredArgsConstructor
public class AddSourceController {

    private final DsService dsService;

    @GetMapping("/toAddSource")
    public String addSource(){
        return "add_source";
    }
}

这样的话当我们请求项目的/toAddSource接口时,跳转到add_source.html,在这个页面中我们进行用户数据的提交动作。

前端页面

html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>添加数据源</title>
    <link rel="stylesheet" th:href="@{/css/style.css}">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/css/all.min.css">
    <script th:src="@{/js/jquery-3.6.0.min.js}"></script>
    <script th:src="@{/js/crypto-js-4.1.1.min.js}"></scri

http://www.kler.cn/a/413007.html

相关文章:

  • LangGraph中的State管理
  • 矩阵重构——sortrows函数
  • 【计算机网络】多路转接之epoll
  • Paddle Inference部署推理(八)
  • 活着就好20241128
  • 嵌入式linux C++通用makefile模板
  • ubuntu,rocky的安装和使用远程连接工具连接服务器
  • C++学习日记---第13天(类和对象---封装)
  • Python 中的装饰器是什么?
  • VOS3000历史话单的非法呼叫话单解决方案,IPSS模块安装详细说明,新增随机端口,新增海外功能,可大幅度提高安全性!
  • Kubeadm 安装 Kubernetes 高可用集群 v1.30.0
  • flink中barrier不对齐的原因和影响
  • Unity类银河战士恶魔城学习总结(P146 Delete Save file-P147 Encryption of save data删除数据和加密数据)
  • 软件测试丨Pytest生命周期与数据驱动
  • 下载安装Android Studio
  • C++模板(入门)
  • Go错误与日志处理—推荐实践
  • STM32F103系列单片机通用和复用I/O(GPIO)
  • 容器和它的隔离机制
  • linux模拟HID USB设备及wireshark USB抓包配置
  • 最小生成树-Prim与Kruskal算法
  • day25|leetCode 491.递增子序列,46.全排列 ,47.全排列 II
  • 算法——四数相加 二(leetcode454)
  • 预处理指令
  • Java线程同步Synchronized
  • Kadb中的ecpg编程