【SpringBoot】11 多数据源(MyBatis:dynamic-datasource)

介绍

多数据源:指的是一个单一应用程序中涉及了两个及以上的数据库,这种配置允许应用程序根据业务需求灵活地管理和操作不同的数据库。

需求

一个应用服务中,连接多个数据库,有本地的也有远程的,有MysQL、Oracle、PostgreSQL(按需配置,可以配置同样的数据源,也可以配置不用的数据源)。

依赖

pom.xml

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

效果图

项目启动时,载入的三个数据源。
在这里插入图片描述在这里插入图片描述
用户接口(wx数据库)
在这里插入图片描述
角色接口(alipay数据库)
在这里插入图片描述
权限接口(oct数据库)
在这里插入图片描述

代码实现

配置文件中连接了三个数据库,wx数据库是MySQL,alipay数据库是Oracle,oct数据库是PostgreSQL。wx数据库是在本地,alipay数据库和oct数据库是在远程,可以按需配置。
注:项目启动程序就会去创建与所有配置数据库之间的连接,如果连不上则会启动失败。

配置

application.yml

server:port: 8888spring:application:name: systemthymeleaf:prefix: classpath:/templates/ #前缀,默认为classpath:/templates/suffix: .html #后缀,默认为.html
#  单个数据库
#  datasource:
#    driver-class-name: com.mysql.cj.jdbc.Driver
#    url: jdbc:mysql://localhost:3306/system?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
#    username: root
#    password: root
# 多个数据库datasource:dynamic:
#      primary: master #默认主库strict: truedatasource:wx: #MySQLdriver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/wx?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8username: rootpassword: rootalipay: #Oracledriver-class-name: oracle.jdbc.OracleDriverurl: jdbc:oracle:thin:@remote:1521:sid #remote是对应机器服务器的远程地址,sid是具体的数据库实例
#          driver-class-name: com.mysql.jdbc.Driver
#          url: jdbc:mysql://localhost:3306/alipay?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8username: rootpassword: rootoct: #PostgreSQLdriver-class-name: org.postgresql.Driverurl: jdbc:postgresql://remote:5432/postgres #remote是对应机器服务器的远程地址
#          driver-class-name: com.mysql.jdbc.Driver
#          url: jdbc:mysql://localhost:3306/oct?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8username: rootpassword: rootmail:#    host: smtp.163.comhost: smtp.qq.comport: 465 #587#    username: xxx@163.comusername: xxx@qq.compassword: xxx #授权码default-encoding: UTF-8properties:mail:debug: truesmtp:socketFactory:class: javax.net.ssl.SSLSocketFactoryssl:enable: trueschedule:cron:  0/5 * * * * ?  #5s执行一次wxFlag: truealipayFlag: falseoctFlag: falselogging:config: classpath:log4j2.ymllevel:com.lm.system.mapper: debug

代码

所有的User相关的方法默认读取wx的MySQL数据库,只要在类上加上 @DS(“wx”) 注解。如果是接口中多个方法用到多个不同的数据源时,可在方法上加@DS(“wx”)注解,该注解是按就近原则进行加载。

User(wxDB)

UserMapper.java

@DS("wx")
public interface UserMapper {}

Role(alipayDB)

Role.java

package com.lm.system.common;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.Date;/*** @author DUHAOLIN* @date 2024/8/21*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Role {@TableId(value = "role_id", type = IdType.INPUT)private Integer roleId; //自增长private String roleName;private String description;private Integer status; //可用状态,0不可用,1可用private Date createTime;private Date updateTime;}

RoleMapper.java

package com.lm.system.mapper;import com.baomidou.dynamic.datasource.annotation.DS;
import com.lm.system.common.Role;import java.util.List;/*** @author DUHAOLIN* @date 2024/8/21*/
@DS("alipay")
public interface RoleMapper {List<Role> queryRoles();}

RoleMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.lm.system.mapper.RoleMapper"><resultMap id="beans" type="com.lm.system.common.Role"><id property="roleId" column="role_id" jdbcType="INTEGER" /><result property="roleName" column="role_name" jdbcType="VARCHAR" /><result property="status" column="status" jdbcType="INTEGER" /><result property="description" column="description" jdbcType="VARCHAR" /><result property="createTime" column="create_time" jdbcType="DATE" /><result property="updateTime" column="update_time" jdbcType="DATE" /></resultMap><select id="queryRoles" resultMap="beans">SELECT * FROM T_ROLE</select></mapper>

RoleController.java

package com.lm.system.controller;import com.lm.system.common.ResultBody;
import com.lm.system.common.Role;
import com.lm.system.mapper.RoleMapper;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;
import java.util.List;/*** @author DUHAOLIN* @date 2024/8/21*/
@RestController
@Api(tags = "角色接口")
@RequestMapping("role")
public class RoleController {@Resourceprivate RoleMapper roleMapper;@GetMapping("query")@ApiOperation("获取角色信息")public String queryRoles() {List<Role> roles = roleMapper.queryRoles();return ResultBody.build(roles == null ? HttpStatus.NO_CONTENT : HttpStatus.OK).setData(roles).setCount(roles == null ? 0 : 1).getReturn();}}

Permission(octDB)

Permission.java

package com.lm.system.common;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.Date;/*** @author DUHAOLIN* @date 2024/8/21*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Permission {@TableId(value = "permission_id", type = IdType.INPUT)private Integer permissionId; //自增长private String permissionName;private String description;private Date createTime;private Date updateTime;}

PermissionMapper.java

package com.lm.system.mapper;import com.baomidou.dynamic.datasource.annotation.DS;
import com.lm.system.common.Permission;import java.util.List;/*** @author DUHAOLIN* @date 2024/8/21*/
public interface PermissionMapper {@DS("oct")List<Permission> queryPermissions();}

Permission.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.lm.system.mapper.PermissionMapper"><resultMap id="beans" type="com.lm.system.common.Permission"><id property="permissionId" column="permission_id" jdbcType="INTEGER" /><result property="permissionName" column="permission_name" jdbcType="VARCHAR" /><result property="description" column="description" jdbcType="VARCHAR" /><result property="createTime" column="create_time" jdbcType="DATE" /><result property="updateTime" column="update_time" jdbcType="DATE" /></resultMap><select id="queryPermissions" resultMap="beans">SELECT * FROM T_PERMISSION</select></mapper>

PermissionController.java

package com.lm.system.controller;import com.lm.system.common.Permission;
import com.lm.system.common.ResultBody;
import com.lm.system.mapper.PermissionMapper;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;
import java.util.List;/*** @author DUHAOLIN* @date 2024/8/21*/
@RestController
@Api(tags = "权限接口")
@RequestMapping("permission")
public class PermissionController {@Resourceprivate PermissionMapper permissionMapper;@GetMapping("query")@ApiOperation("获取权限信息")public String queryPermission() {List<Permission> permissions = permissionMapper.queryPermissions();return ResultBody.build(permissions == null ? HttpStatus.NO_CONTENT : HttpStatus.OK).setData(permissions).setCount(permissions == null ? 0 : 1).getReturn();}}

SQL

t_user.sql

/*Navicat Premium Data TransferSource Server         : localhostSource Server Type    : MySQLSource Server Version : 50734Source Host           : localhost:3306Source Schema         : wxTarget Server Type    : MySQLTarget Server Version : 50734File Encoding         : 65001Date: 21/08/2024 16:49:21
*/SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;-- ----------------------------
-- Table structure for t_user
-- ----------------------------
DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user`  (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,`age` int(11) NULL DEFAULT NULL,`gender` varchar(2) NOT NULL COMMENT ,`deleted` tinyint(1) NOT NULL COMMENT '0未删除,1已删除',`create_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0),`update_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0),PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of t_user
-- ----------------------------
INSERT INTO `t_user` VALUES (1, 'Tom', 18, '男', 0, '2024-08-21 16:47:45', '2024-08-21 16:47:45');
INSERT INTO `t_user` VALUES (2, 'Joe', 20, '女', 0, '2024-08-21 16:47:58', '2024-08-21 16:47:58');
INSERT INTO `t_user` VALUES (3, 'Jim', 33, '女', 0, '2024-08-21 16:48:12', '2024-08-21 16:48:12');SET FOREIGN_KEY_CHECKS = 1;

t_role.sql

--------------------------------------------------------
--  文件已创建 - 星期三-八月-21-2024   
--------------------------------------------------------
--------------------------------------------------------
--  DDL for Table T_ROLE
--------------------------------------------------------SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;-- ----------------------------
-- Table structure for T_ROLE
-- ----------------------------
DROP TABLE IF EXISTS `T_ROLE`;
CREATE TABLE `T_ROLE`  (`ROLE_ID` int(11) NOT NULL AUTO_INCREMENT,`ROLE_NAME` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,`DESCRIPTION` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,`STATUS` tinyint(1) NOT NULL COMMENT '可用状态,0不可用,1可用',`CREATE_TIME` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0),`UPDATE_TIME` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0),PRIMARY KEY (`ROLE_ID`) USING BTREE
);-- ----------------------------
-- Records of T_ROLE
-- ----------------------------
INSERT INTO `T_ROLE` VALUES (-1, '管理员', '拥有所有权限', 1, '2024-08-21 17:04:01', '2024-08-21 17:04:01');
INSERT INTO `T_ROLE` VALUES (1, '财务', '拥有查看和操作权限', 1, '2024-08-21 17:04:14', '2024-08-21 17:04:14');
INSERT INTO `T_ROLE` VALUES (2, '观察员', '拥有查看的账号', 1, '2024-08-21 17:05:19', '2024-08-21 17:05:19');SET FOREIGN_KEY_CHECKS = 1;

t_permission.sql

/*Navicat Premium Data TransferSource Server         : octSource Server Type    : PostgreSQLSource Server Version : 120001Source Host           : remote:portSource Catalog        : octSource Schema         : publicTarget Server Type    : PostgreSQLTarget Server Version : 120001File Encoding         : 65001Date: 21/08/2024 16:53:21
*/-- ----------------------------
-- Table structure for t_permission
-- ----------------------------
DROP TABLE IF EXISTS "public"."t_permission";
CREATE TABLE "public"."t_permission" ("permission_id" varchar(30) COLLATE "pg_catalog"."default" NOT NULL,"permission_name" varchar(30) COLLATE "pg_catalog"."default" NOT NULL,"description" varchar(150) COLLATE "pg_catalog"."default","create_time" timestamp(0) COLLATE "pg_catalog"."default" NOT NULL,"update_time" timestamp(0) COLLATE "pg_catalog"."default" NOT NULL
)
;-- ----------------------------
-- Records of oct
-- ----------------------------
INSERT INTO "public"."t_permission" VALUES (1, '用户管理', '管理用户账号', '2024-08-22 09:35:18', '2024-08-22 09:35:18');
INSERT INTO "public"."t_permission" VALUES (2, '角色管理', '管理用户角色', '2024-08-22 09:35:50',    '2024-08-22 09:35:50');
INSERT INTO "public"."t_permission" VALUES (3, '权限管理', '管理角色权限', '2024-08-22 09:36:05',    '2024-08-22 09:36:05');-- ----------------------------
-- Primary Key structure for table t_permission
-- ----------------------------
ALTER TABLE "public"."t_permission" ADD CONSTRAINT "t_permission_pk" PRIMARY KEY ("id", "option");

项目目录结构图

在这里插入图片描述

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

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

相关文章

Python和MATLAB梯度下降导图

&#x1f3af;要点 寻找局部最小值普通最小二乘法和随机梯度下降的动量线性回归媒体广告销售光学字符识别和最小化均方误差男女医疗费用最快速下降方向函数优化等高线图可视化共轭梯度下降可视化损失函数、动量、涅斯特洛夫动量、权衰减量化不确定性拓扑结构算法分类中权重归一…

Threejs学习-三维坐标系、相机控件

坐标系&#xff1a; Three.js 使用的是右手坐标系&#xff0c;x 轴朝右&#xff0c;y 轴朝上&#xff0c;z 轴朝向自己。 相机控件轨道控制器 相机控件OrbitControls 通过相机控件OrbitControls实现旋转缩放预览效果。 // 设置相机控件轨道控制器OrbitControls const contr…

OpenCV几何图像变换(6)计算反转仿射变换函数invertAffineTransform()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 反转一个仿射变换。 该函数计算由 23 矩阵 M 表示的逆仿射变换&#xff1a; [ a 11 a 12 b 1 a 21 a 22 b 2 ] \begin{bmatrix} a_{11} & a…

windows vs2022 MFC使用webview2嵌入网页

Microsoft Edge WebView2 控件允许在本机应用中嵌入 web 技术(HTML、CSS 以及 JavaScript)。 WebView2 控件使用 Microsoft Edge 作为绘制引擎&#xff0c;以在本机应用中显示 web 内容。 一、通过菜单“项目”-“管理NuGet程序包”&#xff0c;下载相关包 二、安装 Microsof…

结构化与面向对象

人类认识世界总是循序渐进的过程&#xff0c;软件工程也一样&#xff0c;从最开始的单兵作战&#xff0c;再到软件作坊&#xff0c;直到如今的大规模软件开发&#xff0c;软件工程从业者不断总结实践中存在的问题以及解决途径&#xff0c;逐渐形成了一系列的软件工程方法&#…

ZooKeeper--基于Kubernetes部署ZooKeeper

ZooKeeper 服务 服务类型: 无头服务&#xff08;clusterIP: None&#xff09;&#xff0c;这是 StatefulSet&#xff08;有状态集&#xff09;必需的配置。 端口: 2181 (客户端): 用于客户端连接。 2888 (跟随者): 用于 ZooKeeper 服务器之间的连接。 3888 (领导者): 用于领导者…

Linux查看jvm相关参数以及设置调优参数

1、查看jvm相关参数 1.1、查看Java进程命令 jcmd会显示出来对应的Java进程id 1.2、查看堆内存各个区域的使用大小、具体大小和GC次数以及耗时 jstat -gc 4036145jstat -gc 进程id 各个参数的含义。 如上图,4036145的进程,FGCT是0.452,FGC是4.平均每次full gc耗时0.11秒。 …

Android13系统源码内置App并通过AIDL调用获取内置存储卡的真实大小

jix 进行从事Android系统源码开发不得不在原有的系统上内置自己的App。通过内置App一般都需要调用些系统才能访问的系统级App。App的部署和调试需要依赖源码系统。通过命令 &#xff1a; mm 来实现。 第三方App想调用内置的app需要通过跨进程调用。 这里通过AIDL来实现跨进程…

Qt第二十章 数据库操作

文章目录 Qt操作数据库QSqlDataBaseQSqlQuery执行SQL语句 QSqlRecordQSqlField数据库模型QSqlQueryModelQSqlTableModelQSqlRelationalTableModel 编译MySql驱动msvc版本MySql客户端程序部署 Qt操作数据库 需要在cmakelist加上Sql模块 QSqlDataBase 可以通过静态成员查看支持的…

苹果已删除照片的恢复方法有哪些?盘点几种实用办法

苹果设备上的照片往往是珍贵的回忆&#xff0c;但不小心删除照片的情况时有发生。幸运的是&#xff0c;苹果提供了几种方法来帮助用户恢复已删除的照片。本文将详细介绍几种有效的恢复方法&#xff0c;帮助您找回那些重要的照片。 方法一&#xff1a;通过“最近删除”文件夹恢复…

SQL-DCL-数据控制语言

一、 DCL-管理用户 二、DCL-权限控制 一、 DCL-管理用户,主要是DBA数据库管理员使用&#xff0c;开发使用较少 # 1、查询用户 use mysql; show tables; desc user; select * from user; # host为主机地址, 主机地址和用户名确定唯一性# 2、创建用户 create user itcastlocalh…

【AD9361 数字基带】多片基带内FPGA补偿 I/Q Rotation

I/Q 旋转 Rotation 在许多多通道射频系统中&#xff0c;如 AD-FMCOMMS5&#xff0c;甚至在 AD-FMCOMMS2、AD-FMCOMMS3 上&#xff0c;都需要测量或校正两个复数 &#xff08;I/Q&#xff09; RF 信号之间的相位差。 从纯粹的数学描述来看&#xff0c;单个正弦波没有相位&…

【数学建模】趣味数学模型——等额还款数学模型

问题 在银行贷款中&#xff0c;通常采用等额还款。假定银行贷款的年利率为 p&#xff0c;贷款 k 元&#xff0c;分 m 年采用每月等额还款方式还清。问每月还款多少钱&#xff1f;总共还的钱是多少&#xff1f;每月还款中还本金和利息各是多少元&#xff1f; 如果考虑每月等额…

VTK随笔一:初识VTK(QT中嵌入VTK窗口)

VTK&#xff08;Visualization Toolkit&#xff09;是一个用于可视化和图形处理的开源软件库。它提供了一系列的算法和工具&#xff0c;可以用来创建、渲染和处理二维和三维的图形数据。VTK可以在多个平台上运行&#xff0c;并支持各种编程语言&#xff0c;包括C、Python和Java…

基于Springboot + vue + mysql 车辆充电桩管理系统 设计实现

目录 &#x1f4da; 前言 &#x1f4d1;摘要 1.1 研究背景 &#x1f4d1;操作流程 &#x1f4da; 系统架构设计 &#x1f4da; 数据库设计 &#x1f4ac; E-R表 3.4.2 数据库具体设计 系统功能模块 系统首页 用户注册 充电桩 个人中心 用户后台管理模块 用户登录…

完成课题ssrf实现.SSH未创建写shell,同时完成其他漏洞复现

SSRF 一种网络安全漏洞&#xff0c;发生在服务器端应用程序中&#xff0c;允许攻击者通过服务器向任意网络资源发送请求&#xff0c;而无需用户直接参与。这种漏洞通常源于程序设计错误&#xff0c;例如当应用程序使用用户的输入作为URL请求的一部分&#xff0c;而没有适当的验…

Ansible初识

ansible初识 Ansible是一种自动化工具&#xff0c;用于配置管理、应用程序部署和任务自动化。它基于Python语言开发&#xff0c;使用SSH协议进行通信&#xff0c;并且不需要在被管理的主机上安装任何客户端。Ansible使用简单的YAML语言来描述任务和配置&#xff0c;使得操作简…

Vue3的三种样式控制及实现原理

你好&#xff0c;我是沐爸&#xff0c;欢迎点赞、收藏和关注。个人知乎 Vue3中一共有三种样式控制&#xff0c;分别是全局样式控制、局部作用域样式控制和深度样式控制&#xff0c;今天我们一起看下这三种样式控制的使用&#xff0c;以及实现的原理是什么。 一、全局样式控制…

NRK3301语音识别芯片在汽车内饰氛围灯上的应用方案解析

随着智能汽车的快速发展&#xff0c;车载语音交互技术逐渐成为提升驾驶体验的关键技术之一。传统的汽车内饰氛围灯语音识别系统往往依赖于手动操作&#xff0c;不仅操作繁琐&#xff0c;而且在驾驶过程中容易分散驾驶员的注意力。因此&#xff0c;开发一种高效、便捷的汽车内饰…

SpringBoot集成Redis

目录 12.1 配置文件12.2 防火墙12.3 Jedis(一般不用了&#xff0c;了解即可)1.介绍2.步骤3.写YML4.主启动5.业务类 12.4 Lettuce1.介绍以及和Jedis的区别2.步骤1.改pom2.业务类 12.5 Redis Template(推荐)1.连接单机1.改pom2.写YML3.业务类3.1配置类3.2 service3.3 controller测…