ddb-spring-boot-starter使用说明

功能说明

实现springboot+mybatisplus项目中,动态切换数据库连接及实现类的简易方案。实现效果为:1.将数据源连接信息动态维护到数据表中(可以通过页面实时维护到表中);2. 在线选择数据源就可以实时切换数据库连接及实现,以达到真动态切换数据库的目录。

使用示例说明

参照ddb-sample模块,详细代码参见:https://gitee.com/llfsnial/snail-component-library

  1. 依赖

    <dependencies><!-- 这个就是主要的启动类 --><dependency><groupId>com.snail</groupId><artifactId>ddb-spring-boot-starter</artifactId><version>1.0-SNAPSHOT</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.7.18</version></dependency><!-- MySQL驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.27</version></dependency><dependency><groupId>com.oracle</groupId><artifactId>ojdbc6</artifactId><version>11.2.0.3</version></dependency><!-- mybatisPlus 核心库 --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3.2</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.22</version></dependency></dependencies><!-- 主要为了解决依赖冲突的问题 --><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>2.7.18</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>
    
  2. 配置

    server:port: 8786
    spring:datasource:dynamic:# 这个druid必须配置.druid:initial-size: 5min-idle: 5maxActive: 20maxWait: 60000timeBetweenEvictionRunsMillis: 60000minEvictableIdleTimeMillis: 300000validationQuery: SELECT 1 FROM DUALtestWhileIdle: truetestOnBorrow: falsetestOnReturn: falsepoolPreparedStatements: truemaxPoolPreparedStatementPerConnectionSize: 20filters: stat,wall,slf4jprimary: master # 这个是默认的数据库连接.datasource:master:url: jdbc:mysql://xxxx:3306/xxxx?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghaiusername: xxxpassword: xxxxdriver-class-name: com.mysql.cj.jdbc.Driverhikari:connection-test-query: SELECT 1minimum-idle: 5maximum-pool-size: 15max-lifetime: 1800000connection-timeout: 20000idle-timeout: 180000
    mybatis-plus:mapper-locations: classpath:/com/sanil/sample/ddb/mapper/xml/*Mapper.xmlglobal-config:db-config:id-type: autofield-strategy: NOT_EMPTYdb-type: MYSQLconfiguration:map-underscore-to-camel-case: truecall-setters-on-nulls: truelog-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    # 打开这个两个可以看那个configuration未匹配上。
    logging:level:org.springframework.boot.autoconfigure: DEBUGorg.springframework.context.annotation: DEBUG
    
  3. 提供DataSourceInfoProvider的实现

    public class CommonController implements DataSourceInfoProvider {@Overridepublic DataSourceInfo getDataSourceInfo(String dataSourceId) {SysDataSource sysDataSource = getDynamicDbSourceById(dataSourceId);DataSourceInfo dataSourceInfo = new DataSourceInfo();dataSourceInfo.setDbType(Integer.parseInt(sysDataSource.getDbType()));dataSourceInfo.setUrl(sysDataSource.getDbUrl());dataSourceInfo.setUsername(sysDataSource.getDbUsername());dataSourceInfo.setPassword(sysDataSource.getDbPassword());dataSourceInfo.setDriverClassName(sysDataSource.getDbDriver());dataSourceInfo.setId(sysDataSource.getId());return dataSourceInfo;}
    }
    
  4. 提供DynamicDataBase的实现

    @RestController
    @RequestMapping("/dds/dbInfo/")
    @Slf4j
    public class DynamicDataBaseController implements DynamicDataBase {@Autowiredprivate IDbInfoService dbInfoService;@GetMapping("getDbNameList")public Result getDbNameList(String dsName) {Result<List<String>> result = new Result<>();try {List<String> allDataBaseName = dbInfoService.getAllDbName(dsName);result.setSuccess(true);result.setResult(allDataBaseName);return result;} catch (Exception e) {log.error(e.getMessage(), e);result.setSuccess(false);result.setMessage(String.format("查询失败:%s", e.getLocalizedMessage()));}return result;}@Overridepublic void setDataBaseOperator(DataBaseOperator dataBaseOperator) {dbInfoService.setDataBaseOperator(dataBaseOperator);}
    }
    
  5. 提供多个DataBaseOperator的实现

public interface DbInfoMapper extends DataBaseOperator {List<String>  queryAllDbName(String dsName);
}public interface SqlServerDbInfoMapper extends DbInfoMapper {default String getDataBaseType() {return DataBaseTypeRep.getDataBaseType(3).getTypeId();}
}
public interface OracleDbInfoMapper extends DbInfoMapper {default String getDataBaseType(){return DataBaseTypeRep.getDataBaseType(2).getTypeId();};
}
public interface MysqlDbInfoMapper extends DbInfoMapper {default String getDataBaseType(){return DataBaseTypeRep.getDataBaseType(4).getTypeId();};
}

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

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

相关文章

kubernetes自定义pod启动用户

一、kubernetes自定义pod启动用户 一&#xff09;以root用户启动pod containers:- name: ...image: ...securityContext:runAsUser: 0 二&#xff09;以普通用户启动pod 1、从构建镜像角度修改 # RUN命令执行创建用户和用户组&#xff08;命令创建了一个用户newuser设定ID为1…

数据结构——排序(2)

数据结构——排序(2) 文章目录 数据结构——排序(2)前言&#xff1a;1.快速排序&#xff08;非递归版本&#xff09;基本步骤&#xff1a;代码实现 2.归并排序算法思想&#xff1a;核心步骤&#xff1a;代码实现&#xff1a;特征总结&#xff1a; 3.计数排序&#xff08;非比较…

【ubuntu】ubuntu20.04安装cuda12.6与显卡驱动

目录 1.安装cuda12.6 2.安装显卡驱动 1.安装cuda12.6 https://developer.nvidia.com/cuda-toolkit-archive https://developer.nvidia.com/cuda-12-6-0-download-archive?target_osLinux&target_archx86_64&DistributionUbuntu&target_version20.04&target_…

[MyBatis-Plus]快速入门

介绍 MyBatis-Plus是MyBatis的好朋友, 与MyBatis配合, 实现开发效率的提高 官网: 特点: 润物细无声: 只做增强不做改变, 引入它不会对现有工程产生影响, 如丝般顺滑效率自上: 只需简单配置, 即可快速进行单表CRUD, 从而节省大量时间功能丰富: 代码生产, 自动分页, 逻辑删除, …

【重学 MySQL】六十六、外键约束的使用

【重学 MySQL】六十六、外键约束的使用 外键约束的概念关键字主表和从表/父表和子表外键约束的创建条件外键约束的特点外键约束的创建方式外键约束的删除外键约束的约束等级外键约束的级联操作外键约束的示例外键约束的作用开发场景阿里开发规范 在MySQL中&#xff0c;外键约束…

雷池社区版配置遇到问题不要慌,查看本文解决

很多新人不太熟悉反向代理&#xff0c;所以导致配置站点出现问题 配置问题 记录常见的配置问题 配置后攻击测试没有拦截记录 检查访问请求有没有真实经过雷池 有很多新人配置站点后&#xff0c;真实的网站流量还是走的源站&#xff0c;导致雷池这边什么数据都没有 配置后…

【C】分支与循环2--while/for/do-while/goto以及break和continue在不同循环中的辨析~

分支与循环 while循环 if与while的对比 if(表达式)语句&#xff1b;while(表达式)语句&#xff1b;下面来看一个例子&#xff1a; 用 if 写&#xff1a; #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main() {if (1)printf("hehe");//if后面条…

YOLOv8模型改进 第七讲 一种新颖的注意力机制 Outlook Attention

随着目标检测技术的不断发展&#xff0c;YOLOv8 作为最新一代的目标检测模型&#xff0c;已经在多个基准数据集上展现了其卓越的性能。然而&#xff0c;在复杂场景中&#xff0c;如何进一步提升模型的检测精度和鲁棒性依然是一个重要挑战。本文将探讨将 Outlook Attention 机制…

2024第四届”认证杯“数学中国全国大学生数学竞赛参赛通知

2024第四届“认证杯”数学中国 全国大学生数学竞赛报名通知 为了培养人才、服务教学、促进高等学校数学课程的改革和建设&#xff0c;增加大学生学习数学的兴趣&#xff0c;培养分析、解决问题的能力&#xff0c;发现和选拔数学创新人才&#xff0c;为青年学子提供一个展示数…

tortoisegit简单用法

一、基础设置 1.官网 https://tortoisegit.org/ TortoiseGit – Windows Shell Interface to Git 2.下载 3.安装 4.设置 5.克隆远程仓库 二、团队合作 1.在dev分支上创建分支 主分支&#xff1a;master 发开分支&#xff1a;dev 自己的分支&#xff1a;test_branch 2.修…

竹壳天气时钟(一)使用数组保存扫描到的WiFi列表信息

一、简介 准备用基于esp8266的nodemcu开发板做一个天气时钟。 一步一步记录代码编写过程。 /*竹壳天气时钟 Bamboo shell weather clock 使用基于esp8266的NodeMCU制作。 计划用竹子做最后成品的外壳&#xff0c;所以才有了这个名称。 第一阶段任务&#xff1a; 1.实现WiFi连…

mariadb设置远程访问

编辑 /etc/mysql/my.cnf文件&#xff0c;添加以下代码 [mysqld] bind-address 0.0.0.0 在mariadb中添加一个用于远程访问的新用户 先进入mariadb mysql -u root -p 创建用户 // 创建用户 create user remote_user% identified by password; // 给远程访问权限 grant all…

MySQL表的基本查询上

1&#xff0c;创建表 前面基础的文章已经讲了很多啦&#xff0c;直接上操作&#xff1a; 非常简单&#xff01;下一个&#xff01; 2&#xff0c;插入数据 1&#xff0c;全列插入 前面也说很多了&#xff0c;直接上操作&#xff1a; 以上插入和全列插入类似&#xff0c;全列…

小红书新ID保持项目StoryMaker,面部特征、服装、发型和身体特征都能保持一致!(已开源)

继之前和大家介绍的小红书在ID保持以及风格转换方面相关的优秀工作&#xff0c;感兴趣的小伙伴可以点击以下链接阅读~ 近期&#xff0c;小红书又新开源了一款文生图身份保持项目&#xff1a;StoryMaker&#xff0c;是一种个性化解决方案&#xff0c;它不仅保留了面部的一致性&…

智能交通与车联网:未来出行的创新变革

随着全球城市化进程的加速和交通需求的不断增加&#xff0c;传统的交通管理方式已经无法满足日益复杂的交通问题。智能交通&#xff08;Intelligent Transportation System, ITS&#xff09;和车联网&#xff08;Internet of Vehicles, IoV&#xff09;作为现代科技与交通行业深…

云手机:社交平台运营的热门工具

随着互联网的飞速发展&#xff0c;社交平台已经成为企业推广和营销的核心渠道。传统的运营方式已经无法满足高效运营的需求&#xff0c;而云手机作为新兴工具&#xff0c;逐渐成为社交平台运营的前沿趋势。本文将深入分析云手机如何优化社交平台的运营流程&#xff0c;助力企业…

outlook 添加企业邮箱账号出现 553 authentication is required 错误解决

系统报错如下 问题原因 发件服务器身份验证设置错误&#xff0c;或者未勾选发送服务器验证的选项。 解决方案 Outlook客户端 本文以Outlook 2016为例&#xff0c;具体操如下&#xff1a; 1、在Outlook客户端的电子邮件设置窗口中&#xff0c;单击其他设置&#xff1b; 2、…

鸿蒙开发(NEXT/API 12)【发送数据到服务器】远场通信场景

场景介绍 客户端请求发送数据到服务器。 开发步骤 导入模块。 import { rcp } from kit.RemoteCommunicationKit; import { BusinessError } from kit.BasicServicesKit;发起请求。"http://www.example.com"请根据实际情况替换为想要请求的URL地址。 const sess…

【ICPC】The 2021 ICPC Asia Shanghai Regional Programming Contest H

Life is a Game #最小生成树 #重构树 #图论 #贪心 题目描述 A good problem should have a concise statement. You are given an array a a a of length n n n, initially filled with zeros, and another array b b b of length n n n. Your goal is to transform arr…

Pandas处理时间序列之光谱分析与聚类

import matplotlib.pylab as plt %matplotlib inline import numpy as np from numpy import fft import pandas as pd 一、光谱分析 • 将时间序列分解为许多正弦或余弦函数的总和 • 这些函数的系数应该具有不相关的值 • 对正弦函数进行回归 光谱分析应用场景 基于光谱的…