mybatis-plus 多数据源配置

1. 双数据库创建

             

       两个数据库各有一张表

2. yml中配置双数据库

      下面的配置来源于mybatis-plus官网

spring:datasource:dynamic:primary: master #设置默认的数据源或者数据源组,默认值即为masterstrict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源datasource:master:url: jdbc:mysql://1.XX.xx.58:3306/mybatis_plus?serverTimezone=Asia/Shanghai&characterEncoding=utf-8&useSSL=falseusername: rootpassword: xxxdriver-class-name: com.mysql.cj.jdbc.Driverslave:url: jdbc:mysql://1.XX.xx.58:3306/hostDataBase?serverTimezone=Asia/Shanghai&characterEncoding=utf-8&useSSL=falseusername: rootpassword: xxxdriver-class-name: com.mysql.cj.jdbc.Driver

3. Mapper和Service

   3.1 两个表对应的结构体

        表 SPF_Require_Vehicle 对应的结构体

@TableName("SPF_Require_Vehicle")
@Data
public class Employee {/*** 指定主键名称为SPF_uid, 类型为自增,即数据库的字段必须是auto_increment*/@TableId(value = "SPF_UID", type = IdType.AUTO)private Long id;/*** 指定数据库中对应的字段是 Part_PartSap*/@TableField("Part_PartSap")private String partSap;@TableField("Part_PlateSap")private String plateSap;@TableField("SPF_Name")private String name;/*** 逻辑删除*/@TableLogic(value = "0", delval = "1")@TableField("IsActvie")private Boolean active;@TableField("gender")private SexEnum gender;
}

         表Employer对应的结构体

  

@Data
@TableName("Employer")
public class EmployeerDO {@TableId(value = "SPF_Id", type = IdType.AUTO)private Long id;@TableField("SPF_Name")private String name;@TableField("SPF_Age")private int age;@TableLogic(value = "0", delval = "1")@TableField("IsActive")private Boolean active;
}

 3.2 两个Mapper

public interface EmployeeMapper extends BaseMapper<Employee> {/*** 手写语句实现分页查询* @param page 拦截器使用,当前sql中不需要* @param employee 查询对象* @return 查询结果*/Page<Employee> getEmployeeInfoByPage(@Param("page") Page<Employee> page, @Param("employee") Employee employee);}
public interface EmployerMapper extends BaseMapper<EmployeerDO> {
}

3.3 两个service

@Service
/*** 指明当前service处理的是master数据库*/
@DS("master")
@Transactional(rollbackFor = Exception.class)
public class EmployeeServiceImpl extends ServiceImpl<EmployeeMapper, Employee> implements EmployeeService {@Overridepublic List<Employee> getEmployeeInfoByPage(Employee employee) {Page<Employee> page = new Page<>(1, 3);Employee e1 = new Employee();e1.setName("wangshun");this.baseMapper.getEmployeeInfoByPage(page, e1);return page.getRecords();}
}
@Service
/*** 当前service使用的是slave数据库*/
@DS("slave")
@Transactional(rollbackFor = Exception.class)
public class EmployerServiceImpl extends ServiceImpl<EmployerMapper, EmployeerDO> implements EmployerService {
}

3.4  调用侧

        

@Autowiredprivate EmployeeService employeeService;@GetMapping("/saveInfo")@ApiOperation(value = "Employer测试")/*** 如果涉及到多个数据源,则需要使用该注解*/@DSTransactionalpublic void saveEmployerInfo() {EmployeerDO employeerDO = new EmployeerDO();employeerDO.setAge(25);employeerDO.setName("zhangsan");Employee employee = new Employee();employee.setGender(SexEnum.SEX_FEMALE);// 该项为必填项,此处插入抛出异常,整个事务回滚//employee.setPartSap("xxxxx-yy");employee.setPlateSap("yyyyy-xx");employee.setName("111111111");this.employerService.save(employeerDO);this.employeeService.save(employee);}@GetMapping("/saveEmployee")@ApiOperation(value = "Employee测试")/*** 单个service,使用传统事务即可*/@Transactional(rollbackFor = Exception.class)public void testEmployee() {Employee employee = new Employee();employee.setGender(SexEnum.SEX_FEMALE);employee.setPartSap("xxxxx-yy");employee.setPlateSap("yyyyy-xx");employee.setName("111111111");this.employeeService.save(employee);// 事务会回滚int tmp = 1/0;this.employeeService.getEmployeeInfoByPage(null);}

4.  @DSTransactional

        该注解和@Transaction的区别在于: 当一个函数中同时操作多个数据源时,即有多个service,则需要使用@DSTransactional 注解; 如果一个函数中操作的是同一个数据源,即只有一个service,则只需要使用 @Transactional

见    @Transactional和@DS避免数据源冲突的解决方案(提供gitee源码)_@dstransactional_一个资深码农的博客-CSDN博客

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

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

相关文章

k8s-10 ingress-nginx 特性

TLS加密 创建证书 测试 auth认证 创建认证文件 rewrite重定向 进入域名 会自动重定向hostname.html 示例二&#xff1a; 测试 后面必须跟westos 这个关键字 canary金丝雀发布 基于header灰度 场景&#xff1a;版本的升级迭代&#xff0c;比如一个service 升级到另…

基于SpringBoot的房屋租赁管理系统的设计与实现

目录 前言 一、技术栈 二、系统功能介绍 屋主管理 房屋信息管理 房屋租赁公告 租用订单管理 房屋信息管理 保洁管理 房屋信息 租用订单管理 取消订单管理 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 互联网发展至今&#xff0c;无论是其理论还是…

分布式数据库(林子雨慕课课程)

文章目录 4. 分布式数据库HBase4.1 HBase简介4.2 HBase数据模型4.3 HBase的实现原理4.4 HBase运行机制4.5 HBase的应用方案4.6 HBase安装和编程实战 4. 分布式数据库HBase 4.1 HBase简介 HBase是BigTable的开源实现 对于网页搜索主要分为两个阶段 1.建立整个网页索引&#xf…

【juc】future并行执行并获取返回值

目录 一、截图示例二、代码示例2.1 接口示例2.2 调用示例 一、截图示例 二、代码示例 2.1 接口示例 package com.learning.controller;import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.…

Flink+Doris 实时数仓

Flink+Doris 实时数仓 Doris基本原理 Doris基本架构非常简单,只有FE(Frontend)、BE(Backend)两种角色,不依赖任何外部组件,对部署和运维非常友好。架构图如下 可以 看到Doris 的数仓架构十分简洁,不依赖 Hadoop 生态组件,构建及运维成本较低。 FE(Frontend)以 Java 语…

c++中的map和set

文章目录 1. 关联式容器2. 键值对3. 树形结构的关联式容器3.1 set3.1.1 set的介绍3.1.2 set的使用 3.2 map3.2.1 map的介绍3.2.2 map的使用 3.3 multiset3.3.1 multiset的介绍3.3.2 multiset的使用 3.4 multimap3.4.1 multimap的介绍3.4.2 multimap的使用 1. 关联式容器 在初阶…

使用弹性盒子flex对html进行布局和动态计算视口高度

使用弹性盒子flex对html进行布局的一个练习 height: calc(100vh - 4px); # vh表示视口高度的百分比&#xff0c;所以100vh表示整个视口的高度。 .mytxt { text-indent: 2em; /* 首航缩进2字符 */ line-height: 2; /* 2倍行高 */ padding: 8px; /* 内容与边框的距离 */ } …

Redis到底是什么?都有哪些特性?看完这一篇就都会了

目录 Redis是什么 Redis的应用场景有哪些&#xff1f; Redis的数据类型及主要特性 Redis的数据结构 简单动态字符串SDS (Simple Dynamic String) SDS的特点 Redis特性1&#xff1a;事务 Redis特性2&#xff1a;发布订阅(Pub/Sub) Redis特性3&#xff1a;Stream Redis…

Tailwind CSS浅析与实操

Tailwind CSS 一、Tailwind CSS简介 What is Tailwind CSS Tailwind CSS| TailwindCSS中文文档 | TailwindCSS中文网官方解释&#xff1a;只需书写 HTML 代码&#xff0c;无需书写 CSS&#xff0c;即可快速构建美观的网站。本质上是一个工具集&#xff0c;包含了大量类似 fle…

程序无法启动,提示“找不到msvcp140.dll”或“msvcp140.dll缺失报错”解决方法

大家好&#xff01;今天我来给大家分享一下msvcp140.dll丢失的解决方法。我们都知道&#xff0c;在运行一些软件或游戏时&#xff0c;经常会遇到“找不到msvcp140.dll”的错误提示&#xff0c;这会让我们非常苦恼。那么&#xff0c;这个问题该怎么解决呢&#xff1f;下面我将为…

等精度频率计verilog,quartus仿真视频,原理图,代码

名称&#xff1a;等精度频率计设计verilog quartus仿真 软件&#xff1a;Quartus 语言&#xff1a;Verilog 要求&#xff1a; A&#xff1a;测量范围信号:方波 频率:100Hz~1MHz; B&#xff1a;测试误差:<0.1%(全量程) C&#xff1a;时钟频率:50kHz D&#xff1a;预闸…

Django 前端模板显示换行符、日期格式

linebreaksbr 显示换行符 <td>{{ data.sku_list|default:"无"|linebreaksbr }}</td> date:"Y年m月d日 H:i" 设置日期格式 <td>{{ data.submit_time|date:"Y年m月d日 H:i" }}</td> 其他语法 forloop 获取循环的索引 …

ChatGLM2-6B微调实践

ChatGLM2-6B微调实践 环境准备安装部署1、安装 Anaconda2、安装CUDA3、安装PyTorch4、安装 ChatGLM2-6B 微调实践1、准备数据集2、安装python依赖3、微调并训练新模型4、微调后模型的推理与评估5、验证与使用微调后的模型 微调过程中遇到的问题 环境准备 申请阿里云GPU服务器&…

【虹科分享】什么是Redis数据集成(RDI)?

大量的应用程序、日益增长的用户规模、不断扩展的技术需求&#xff0c;以及对即时响应的持续追求。想想这些是否正是你在经历的。也许你尝试过自己构建工具来应对这些需求&#xff0c;但是大量的编码和集成工作使你焦头烂额。那你是否知道&#xff0c;有这样一个工具可以帮助你…

计算机竞赛 题目:基于深度学习的中文汉字识别 - 深度学习 卷积神经网络 机器视觉 OCR

文章目录 0 简介1 数据集合2 网络构建3 模型训练4 模型性能评估5 文字预测6 最后 0 简介 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学习的中文汉字识别 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &a…

从入门到精通,30天带你学会C++【第七天:for循环和while循环以及数组的学习】(学不会你找我)

目录 Everyday English 前言 数组 数组的概念 数组的定义 数组的下标 for循环 循环是什么 基本格式 多重循环 while循环 do-while循环 总结 Everyday English To shine , not be illuminated. 去发光&#xff0c;而不是被照亮。 前言 好久不见&#xff0c…

kafka初体验基础认知部署

kafka 基础介绍 Apache Kafka是一个分布式流处理平台&#xff0c;最初由LinkedIn开发并于2011年开源。它主要用于解决大规模数据的实时流式处理和数据管道问题。 Kafka是一个分布式的发布-订阅消息系统&#xff0c;可以快速地处理高吞吐量的数据流&#xff0c;并将数据实时地分…

图片素材免费下载,高清无水印,无需担心版权问题。

找图片素材就上这8个网站&#xff0c;免费可商用&#xff0c;建议收藏起来~ 1、菜鸟图库 https://www.sucai999.com/pic.html?vNTYwNDUx 网站主要为新手设计师提供免费素材&#xff0c;这些素材的质量都很高&#xff0c;类别也很多&#xff0c;像平面、UI、电商、视频、图片…

【1++的Linux】之进程(五)

&#x1f44d;作者主页&#xff1a;进击的1 &#x1f929; 专栏链接&#xff1a;【1的Linux】 文章目录 一&#xff0c;什么是进程替换二&#xff0c;替换函数三&#xff0c;实现我们自己的shell 一&#xff0c;什么是进程替换 我们创建出来进程是要其做事情的&#xff0c;它可…

掌握 BERT:自然语言处理 (NLP) 从初级到高级的综合指南(1)

简介 BERT&#xff08;来自 Transformers 的双向编码器表示&#xff09;是 Google 开发的革命性自然语言处理 (NLP) 模型。它改变了语言理解任务的格局&#xff0c;使机器能够理解语言的上下文和细微差别。在本文[1]中&#xff0c;我们将带您踏上从 BERT 基础知识到高级概念的旅…