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

MyBatis plus 多数据源实现

1. 项目背景

最近写文章发布到【笑小枫】小程序和我的个人网站上,因为个人网站用的是halo框架搭建,两边数据结构不一致,导致我每次维护文章都需要两边维护,这就很烦~

于是,本文就诞生了。通过项目连接这两个数据库,我在维护文章的时候,同时同步下个人网站的博客。

PS:果然,程序员就是懒🤪

深度PS:在七夕发布这一篇文章,感觉不对劲呀,还是要专一,不能多…【手动狗头,不是单身的那种】

2. 项目准备

项目使用的是Mybatis plus。这里简单点,直接使用Mybatis plus的多数据源,简单方便。

这里已经脱离了原有代码。单独抽出了一个小Demo,小枫我还是很贴心的。不让你们看我那乱七八糟的逻辑了~

这里只是为了演示,实际按你们项目来就行了

2.1 准备数据库

首先创建两个数据库吧,这里演示就叫testtest2了。

然后简单点,每个表创建一张表好了。

test创建user表:

CREATE TABLE `user` (`id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',`login_name` VARCHAR(64) NOT NULL COMMENT '登录名',`password` VARCHAR(128) NOT NULL COMMENT '密码',`create_time` DATETIME NOT NULL COMMENT '创建时间',`update_time` DATETIME NOT NULL COMMENT '更新时间',PRIMARY KEY (`id`) USING BTREE
)COMMENT='用户表' COLLATE='utf8_general_ci' ENGINE=InnoDB;

test2创建product表:

CREATE TABLE `product` (`id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',`name` VARCHAR(64) NOT NULL COMMENT '名称',`remark` VARCHAR(128) NOT NULL COMMENT '备注',`create_time` DATETIME NOT NULL COMMENT '创建时间',`update_time` DATETIME NOT NULL COMMENT '更新时间',PRIMARY KEY (`id`) USING BTREE
)COMMENT='商品表' COLLATE='utf8_general_ci' ENGINE=InnoDB;

创建完之后就是这样:

image-20230822104220517

3. 功能实现

简单点吧,接下来坐飞机🛫,直接飞核心内容,算了还是火箭吧🚀。

3.1 引入依赖

这里的版本和mybatis-plus版本一致就可以了,这里用<mybatis-plus-version>3.5.2</mybatis-plus-version>

        <!-- 多数据源 --><dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>${mybatis-plus-version}</version></dependency>

3.2 生成基础对象

然后使用Mybatis plus代码生成工具生成基础对象,具体代码就不贴了,需要的可以看Github源码,源码地址放在文章最后。

这里controller用了一个,其它的分包了,实际根据项目需求来就行,影响不大,自己看着舒服就行。

在Application.java上添加@MapperScan的注解。

package com.maple.dynamic;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
@MapperScan({"com.maple.dynamic.test.mapper", "com.maple.dynamic.test2.mapper"})
public class MapleDynamicDatasourceApplication {public static void main(String[] args) {SpringApplication.run(MapleDynamicDatasourceApplication.class, args);}
}

整个项目的结构如下:

image-20230822111227672

3.3 配置数据库链接

配置application.yml文件,这里使用yml格式哈。

server:port: 8080spring:datasource:dynamic:primary: master #设置默认的数据源或者数据源组,默认值即为masterstrict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源datasource:master:url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=yes&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8username: rootpassword: Zhang123driver-class-name: com.mysql.cj.jdbc.Drivertest2:url: jdbc:mysql://127.0.0.1:3306/test2?useUnicode=yes&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8username: rootpassword: Zhang123driver-class-name: com.mysql.cj.jdbc.Driver

默认数据库是master,test2配置了一个test2的数据源,这里的master和test2可以根据自己需求命名。

3.4 使用演示

默认的是master数据源,这里就不做配置了。

如果想使用test2数据源,需要在service上添加@DS(“test2”)注解切换数据源。

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

注解结果
没有@DS默认数据源
@DS(“dsName”)dsName可以为组名也可以为具体某个库的名称

我们给ProductServiceImpl.java添加上@DS("test2")注解。

image-20230822133533034

创建TestController.java,添加测试方法,如下图所示:

image-20230822133727369

4. 功能测试

好了,项目的整体配置都OK了,我们一起来看一下效果吧。

启动项目

image-20230822133901848

可以看到[test2]、[master]添加成功。其中[master]为主数据源。

我们调用下GET http://localhost:8080/test试下,可以看到成功取到了数据。

image-20230822134100660

好了,本文就到这里了。也懒得总结了,总结内容看标题吧😅

5. 项目源码

https://github.com/hack-feng/maple-product/

其中maple-dynamic-datasource模块即为本文的Demo源码。需要的朋友可以看下。

感兴趣的朋友可以帮忙点个star⭐⭐⭐⭐⭐后续会有更多Java相关的集成Demo,让我来做你的百宝袋吧。

相关文章:

MyBatis plus 多数据源实现

1. 项目背景 最近写文章发布到【笑小枫】小程序和我的个人网站上&#xff0c;因为个人网站用的是halo框架搭建&#xff0c;两边数据结构不一致&#xff0c;导致我每次维护文章都需要两边维护&#xff0c;这就很烦~ 于是&#xff0c;本文就诞生了。通过项目连接这两个数据库&a…...

k-近邻算法概述,k-means与k-NN的区别对比

目录 k-近邻算法概述 k-近邻算法细节 k值的选取 分类器的决策 k-means与k-NN的区别对比 k-近邻算法概述 k近邻&#xff08;k-nearest neighbor, k-NN&#xff09;算法由 Cover 和 Hart 于1968年提出&#xff0c;是一种简单的分类方法。通俗来说&#xff0c;就是给定一个…...

node 项目搭建

1. 初始化项目 cmd 执行 cnpm init -y 创建README.md 依赖安装 1. 数据库 和 框架 mysql express cnpm install mysql express --save 2. 后端跨域 cors cnpm i cors 3. 安装 body-parser 声明引用 用于接收前端 post 过来的数据 cnpm install --save body-parser 4…...

CSS 属性值计算过程

目录 例子1&#xff0c;确定声明值2&#xff0c;层叠冲突2.1&#xff0c;比较源重要性2.2&#xff0c;比较优先级2.3&#xff0c;比较源次序 3&#xff0c;使用继承4&#xff0c;使用默认值其他 例子 我们来举例说明<h1> 标签最终的样式&#xff1a; <div><h1…...

QT版权查询

文章目录 QT工具版权QT模块版权查询 根据条件自动筛选&#xff1a; Qt Features, Framework Essentials, Modules, Tools & Add-Ons QT工具版权 Licensing QT模块版权查询 在 All Modules 中点击进入每个模块&#xff0c;在详细内容中一般有Lisence相关内容。 Licens…...

【leetcode 力扣刷题】双指针///原地扩充线性表

双指针///原地扩充线性表 剑指 Offer 05. 替换空格定义一个新字符串扩充字符串&#xff0c;原地替换思考 剑指 Offer 05. 替换空格 题目链接&#xff1a;剑指 Offer 05. 替换空格 题目内容&#xff1a; 这是一道简单题&#xff0c;理解题意&#xff0c;就是将字符串s中的空格…...

第八章,帖子列表

8.1添加帖子列表 <script> import { mapState } from vuex . . . </script> computed: {...mapState([auth,user,articles]) }, <Message :sh...

netty与websockt实现聊天

配置websockt&#xff1a; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration;/*** websocket配置*/ Data Configuration ConfigurationProperties(prefix &qu…...

21.2 CSS 三大特性与页面布局

1. 开发者工具修改样式 使用开发者工具修改样式, 操作步骤如下: * 1. 打开开发者工具: 在浏览器中右键点击页面, 然后选择检查或者使用快捷键(一般是 F12 或者 CtrlShiftI)来打开开发者工具.* 2. 打开样式编辑器: 在开发者工具中, 找到选项卡或面板, 一般是Elements或者Elemen…...

MySQL 特殊语法时间格式以及Greadb连接

一、时间语法 DATE_FORMAT和to_char() select to_char(now(),%Y-%m-%d %H:%i:%s) from dual; select DATE_FORMAT(now(),%Y-%m-%d %H:%i:%s) from dual; 2.to_date() 和STR_TO_DATE(#{date},%Y-%m-%d ) select to_date(now(),yyyy-mm-dd hh24:mi:ss) from dual;...

Python(.pyc)反编译:pycdc工具安装与使用

本文将介绍如何将python的.pyc文件反编译成源码&#xff0c;以便我们对源码的学习与改进。pycdc工具安装 下载地址&#xff1a; 1、Github地址&#xff1a;https://github.com/zrax/pycdc &#xff0c;下载后需要使用CMake进行编译。 2、已下载好及编译好的地址&#xff1a;ht…...

山西电力市场日前价格预测【2023-08-28】

日前价格预测 预测明日&#xff08;2023-08-28&#xff09;山西电力市场全天平均日前电价为319.70元/MWh。其中&#xff0c;最高日前电价为371.80元/MWh&#xff0c;预计出现在19: 15。最低日前电价为278.59元/MWh&#xff0c;预计出现在13: 00。 价差方向预测 1&#xff1a; …...

python3/pip3 SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed

环境&#xff1a; mac os 背景&#xff1a; 电脑之前安装的是python3.9 &#xff0c; 现在升级到python3.10。 从python官网下载macos版本的python3.10 pkg。 双击安装。 程序使用aiohttp访问ebay 。 出错&#xff1a; aiohttp.client_exceptions.ClientConnectorCertifi…...

Python中的迭代器与生成器

文章目录 1、迭代器2、生成器3、列表推导式和生成器表达式4、enumerate() 在Python中&#xff0c;迭代器&#xff08;Iterator&#xff09;和生成器&#xff08;Generator&#xff09;是两种用于处理可迭代对象的重要工具。而可迭代对象包括列表&#xff0c;元组&#xff0c;字…...

简单着色器编写(下)

函数部分介绍完了&#xff0c;最后来介绍一下main函数中的部分。 std::string vertexShader "#version 330 core\n" "\n" "layout(location0)in vec4 position;" "\n" "void main()\n" "{\n&…...

go并发编程基础

go并发编程 1waitgroup WaitGroup就是等待所有的goroutine全部执行完毕&#xff0c;add方式和Down方法要配套使用 package mainimport ("fmt""sync" )func main() {var wq sync.WaitGroupwq.Add(100) //监控多少个goroutine执行结束for i: 0;i<100;…...

PHP之 导入excel表格时,获取日期时间变成浮点数

读取到的时间 float(0.20833333333333) 原格式 15:00:00 代码 if (Request::isPost()) {$file_url input(upfile); // 本地上传文件地址// 读取文件内容$local_file_url __dir__./../../../public.$file_url;// $spreadsheet new Spreadsheet();// $sheet $spreadsheet-…...

学习 Java 报表技术导入 Maven 依赖出错:jacob 无法下载、jasperreports 依赖错误

发生缘由 最近在做一个可视化项目&#xff0c;用到了 Java 报表技术。在跟着「黑马」课程导入 pom.xml 文件的时候提示下载依赖错误。 com.jacob 包无法下载Failed to read artifact descriptor for com.lowagie:itext:jar:2.1.7.js6 运行环境 电脑系统版本&#xff1a;Win…...

力扣-哈希-最长连续序列

题目 给定一个未排序的整数数组 nums &#xff0c;找出数字连续的最长序列&#xff08;不要求序列元素在原数组中连续&#xff09;的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1&#xff1a; **输入&#xff1a;**nums [100,4,200,1,3,2] **输出&a…...

Java线程 - 详解(1)

一&#xff0c;创建线程 方法一&#xff1a;继承Thread类 class MyThread extends Thread{Overridepublic void run() {System.out.println("线程1");} }public class Test {public static void main(String[] args) {MyThread myThread new MyThread();myThread.…...

结构体-C语言(初阶)

目录 一、结构体声明 1.1 结构概念 1.2 结构声明 1.3 结构成员的类型 1.4 结构体变量的定义和初始化 二、结构体成员的访问 2.1 结构体变量访问成员 2.2 结构体指针访问指向变量的成员 三、结构体传参 一、结构体声明 1.1 结构概念 结构是一些值的集合&#xff0c;这些值称为…...

【网络】HTTPS的加密

目录 第一组&#xff0c;非对称加密第二组&#xff0c;非对称加密第三组&#xff0c;对称加密证书签名 HTTPS使用的是非对称加密加对称加密的方案 &#xff08;非对称加密&#xff1a;公钥加/解密&#xff0c;私钥解/加密&#xff09; &#xff08;对称加密&#xff1a;一组对称…...

Nacos安装指南

Nacos安装指南 1.Windows安装 开发阶段采用单机安装即可。 1.1.下载安装包 在Nacos的GitHub页面&#xff0c;提供有下载链接&#xff0c;可以下载编译好的Nacos服务端或者源代码&#xff1a; GitHub主页&#xff1a;https://github.com/alibaba/nacos GitHub的Release下载…...

java-Optional 类详解

目录 前言 Optional的构造方法 Optional的相关方法介绍 isPresent用法&#xff1a; get用法&#xff1a; filter用法&#xff1a; orElse用法&#xff1a; orElseGet用法 orElseThrow用法 map用法 flatMap用法&#xff1a; 前言 Optional 类是java8的新特性&#xff0…...

sql数据库怎么备份,sql 实时备份

在当今互联网时代&#xff0c;数据已经成为企业的核心资产。然而&#xff0c;数据的安全性和完整性面临硬件问题、软件故障、人工操作错误等各种威胁。为了保证数据的安全&#xff0c;实时备份已经成为公司必须采取的重要措施之一。下面我们就重点介绍SQL实时备份的重要实施方法…...

RK3399平台开发系列讲解(存储篇)Linux 存储系统的 I/O 栈

平台内核版本安卓版本RK3399Linux4.4Android7.1🚀返回专栏总目录 文章目录 一、Linux 存储系统全景二、Linux 存储系统的缓存沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍 Linux 存储系统的 I/O 原理。 一、Linux 存储系统全景 我们可以把 Linux 存储系…...

Java“牵手”天猫淘口令转换API接口数据,天猫API接口申请指南

天猫平台商品淘口令接口是开放平台提供的一种API接口&#xff0c;通过调用API接口&#xff0c;开发者可以获取天猫商品的标题、价格、库存、商品快递费用&#xff0c;宝贝ID&#xff0c;发货地&#xff0c;区域ID&#xff0c;快递费用&#xff0c;月销量、总销量、库存、详情描…...

postgresql 条件表达式

postgresql 条件表达式 简单CASE表达式搜索CASE表达式缩写函数nullif函数示例 coalesce函数 总结 简单CASE表达式 语法如下 case 表达式when 值1 then 结果1when 值2 then 结果2else 默认值 end;select e.first_name , e.last_name , case e.department_id when 90 then 管…...

姜启源数学模型第五版第五章火箭发射升空

姜启源数学模型第五版第五章例题内容复现 数学建模背景1.学习内容火箭发射升空理论知识 2.例题3.问题分析不考虑空气阻力的模型考虑空气阻力的模型 4.代码内容复现不考虑空气阻力考虑空气阻力模型 数学建模背景 首先先简单的介绍数学建模是一个怎么样的内容 数学建模是一种将数…...

局域网中电脑共享文件给手机

学习资源&#xff1a; 局域网共享&#xff1a;这样设置&#xff0c;你可以轻松拷贝任何电脑的文件。_哔哩哔哩_bilibili 可以实现什么效果&#xff1f; 连接同一个WIFI&#xff0c;电脑端为服务端&#xff0c;提供共享文件&#xff0c;手机是客户端&#xff0c;可以读取服务端…...

石河子建设局网站搜索新开工程清欠工作审查联办单/下拉关键词排名

百度网盘 出版社: 机械工业出版社; 第1版 (2018年3月1日)外文书名: Machine Learning by Scikit-learn:Algorithms and Practices平装: 207页语种&#xff1a; 简体中文开本: 16ISBN: 7111590244, 9787111590248条形码: 9787111590248商品尺寸: 23.8 x 18.6 x 1 cm商品重量: 66…...

建设银行网站的特点优势/谷歌官网首页

1、小程序的发展 jsbridge -> js-sdk -> 小程序 腾讯内部使用的jsbridge&#xff0c;被外部发现&#xff0c;并使用&#xff0c;逐渐成为微信中网页的事实标准。后提供了外部使用的js-sdk&#xff0c;之后为了提供更丰富的能力&#xff0c;提供小程序。小程序中js的组成&…...

wordpress分销插件/发外链软件

ROS action客户端和服务端通信 gcusms ROS 一般都是用 service 和 topic 进行数据之间的交互传输&#xff0c;因为这种通信方式无法满数据实时反馈的要求&#xff0c;所以采用 action 动作消息反馈通信机制&#xff08;实时反馈的任务进度&#xff0c;并且可以随时终止运行&am…...

建站平台步骤详解/广州新闻头条最新消息

nameA def change_name():nameA2def change_name2():nameA3print(第三层,name)change_name2()print(第二层,name)change_name() print(最外层打印,name) 运行结果如下&#xff1a; RESTART: C:\pylianxi\qiantao.py 第三层 A3 第二层 A2 最外层打印 A >>> 这段代码…...

嘉兴 网站 建设/福州seo博客

说明&#xff1a;站在巨人肩膀上才能成长得更快高大。像本引文中这样的案例真是不错&#xff0c;虽然仅是个雏形&#xff0c;但它已经向您展示了“保卫萝卜”这样塔防游戏的核心逻辑&#xff01;&#xff01;&#xff01;原文链接&#xff1a; http://www.cocoachina.com/bbs/r…...

平顶山建设银行网站/建站平台哪个好

Monkey简介 Monkey程序是Android系统自带&#xff0c;使用Java语言写成&#xff0c;在Android文件系统中的存放路径&#xff1a;/system/firmework/monkey; monkey可以运行在模拟器或实际设备中&#xff0c;它向系统发送伪随机的用户事件流&#xff08;如按键输入、触摸屏输入和…...