SpringBoot+Mybatis 配置多数据源及事务管理

目录

1.多数据源

2.事务配置


项目搭建参考:

从零开始搭建SpringBoot项目_从0搭建springboot项目-CSDN博客

SpringBoot学习笔记(二) 整合redis+mybatis+Dubbo-CSDN博客

1.多数据源

添加依赖

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.5</version></dependency><!--MyBatis整合SpringBoot的起步依赖--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.2</version></dependency><!--MySQL的驱动依赖--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.31</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.16.10</version></dependency></dependencies>

增加数据库配置

spring.datasource.primary.jdbc-url=jdbc:mysql://xxxx/table01?useUnicode=true&autoReconnect=true&zeroDateTimeBehavior=convertToNull
spring.datasource.primary.username=xxxxx
spring.datasource.primary.password=xxxxx
spring.datasource.primary.driver-class-name=com.mysql.jdbc.Driverspring.datasource.second.jdbc-url=jdbc:mysql://xxxxx/table02?useUnicode=true&autoReconnect=true&&zeroDateTimeBehavior=convertToNull
spring.datasource.second.username=xxxxx
spring.datasource.second.password=xxxxx
spring.datasource.second.driver-class-name=com.mysql.jdbc.Driver

添加配置类

PrimaryDbConfig.java

@Configuration
@MapperScan(basePackages = {"com.ziroom.dao.primary"}, sqlSessionFactoryRef = "primarySqlSessionFactory")
public class PrimaryDbConfig {@Primary   // 这里要添加@Primary,在匹配不到数据源时,primaryData会作为默认数据源@Bean(name = "primaryData")@ConfigurationProperties(prefix = "spring.datasource.primary")public DataSource financeData() {return DataSourceBuilder.create().build();}@Bean(name = "primarySqlSessionFactory")@Primarypublic SqlSessionFactory loanSqlSessionFactory(@Qualifier("primaryData") DataSource dataSource) throws Exception {SqlSessionFactoryBean bean = new SqlSessionFactoryBean();bean.setDataSource(dataSource);bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml"));return bean.getObject();}@Bean(name = "primarySqlSessionTemplate")@Primarypublic SqlSessionTemplate loanSqlSessionTemplate(@Qualifier("primarySqlSessionFactory") SqlSessionFactory sqlSessionFactory) {return new SqlSessionTemplate(sqlSessionFactory);}
}// 事务配置@Bean(name = "primaryTransactionManager")@Primarypublic DataSourceTransactionManager masterDataSourceTransactionManager(@Qualifier("primaryData") DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}

SecondDbConfig.java

@Configuration
@MapperScan(basePackages = {"com.ziroom.dao.second"}, sqlSessionFactoryRef = "secondSqlSessionFactory")
public class SecondDbConfig {@Bean(name = "secondData")@ConfigurationProperties(prefix = "spring.datasource.second")public DataSource financeData() {return DataSourceBuilder.create().build();}@Bean(name = "secondSqlSessionFactory")public SqlSessionFactory loanSqlSessionFactory(@Qualifier("secondData") DataSource dataSource) throws Exception {SqlSessionFactoryBean bean = new SqlSessionFactoryBean();bean.setDataSource(dataSource);bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml"));return bean.getObject();}@Bean(name = "secondSqlSessionTemplate")public SqlSessionTemplate loanSqlSessionTemplate(@Qualifier("secondSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {return new SqlSessionTemplate(sqlSessionFactory);}
}// 事务配置
@Bean(name = "secondTransactionManager")public DataSourceTransactionManager masterDataSourceTransactionManager(@Qualifier("secondData") DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}

添加mapper相关

启动类屏蔽DataSourceAutoConfiguration.java

注意:类似于SpringBoot学习笔记(二) 整合redis+mybatis+Dubbo-CSDN博客 中单数据源的情况,配置文件中配置了spring.datasource.* ,且@MapperScan(value = "com.xxxx.crm.demo.mapper")加到主类上,说明指定的dao关联了默认的spring.datasource.*, 这种情况则不能排除DataSourceAutoConfiguration.class

添加测试类

@ResponseBody@RequestMapping(value = "/testPrimary")public String testPrimary(){Budget budget = new Budget();List<Budget> budgets = budgetMapper.queryBudgetActualList(budget);log.info("Primary 数据源查询 size:{}", budgets.size());return "success";}-- 输出:Primary 数据源查询 size:30@ResponseBody@RequestMapping(value = "/testSecond")public String testSecond(){Invoice invoice = new Invoice();List<Invoice> invoices = invoiceMapper.selectListByParams(invoice);log.info("Second 数据源查询 size:{}", invoices.size());return "success";}
-- 输出:Second 数据源查询 size:40

2.事务配置

PrimaryDbConfig.java中增加

@Bean(name = "primaryTransactionManager")public DataSourceTransactionManager masterDataSourceTransactionManager(@Qualifier("primaryData") DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}

SecondDbConfig.java中增加

@Bean(name = "secondTransactionManager")public DataSourceTransactionManager masterDataSourceTransactionManager(@Qualifier("secondData") DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}

测试类 BudgetService.java

@Service
public class BudgetService {@Autowiredprivate BudgetMapper budgetMapper;@Autowiredprivate InvoiceMapper invoiceMapper;@Transactional(value="primaryTransactionManager",rollbackFor = RuntimeException.class)public void saveBudget(Budget budget) {budget.setBudgetYear(1);budget.setBudgetMonth(1);budget.setPartner("2");budgetMapper.insertSelective(budget);if(true){throw new RuntimeException("数据源1抛出异常");}}@Transactional(value="secondTransactionManager",rollbackFor = RuntimeException.class)public void saveInvoice(Invoice invoice) {invoice.setPostingDate(new Date());invoice.setAdvancePayment("x");invoice.setInvoiceDate(new Date());invoice.setJournalDate(new Date());invoice.setAllocateRowNo(1);invoiceMapper.insertSelective(invoice);if(true){throw new RuntimeException("数据源2抛出异常");}}
}

启动类加:@EnableTransactionManagement

代码详见https://github.com/lizhjian/SpringBootTest

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

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

相关文章

TCP--拥塞控制

大家好&#xff0c;我叫徐锦桐&#xff0c;个人博客地址为www.xujintong.com。平时记录一下学习计算机过程中获取的知识&#xff0c;还有日常折腾的经验&#xff0c;欢迎大家来访。 TCP中另一个重要的点就是拥塞控制&#xff0c;TCP是无私的当它感受到网络拥堵了&#xff0c;就…

字节码进阶之javassist字节码操作类库详解

字节码进阶之javassist字节码操作类库详解 文章目录 前言使用教程添加Javassist依赖库创建和修改类方法拦截创建新的方法 进阶用法创建新的注解创建新的接口创建新的构造器生成动态代理修改方法示例2 前言 Javassist&#xff08;Java programming assistant&#xff09;是一个…

磁盘分区如何分? 电脑磁盘分区免费软件指南!

列出并比较顶级免费磁盘分区管理器软件&#xff0c;以选择适用于 Windows 的最佳分区软件&#xff1a; 系统分区在现代计算机设备中起着非常重要的作用。它们可以存储数据&#xff0c;使系统文件远离用户数据&#xff0c;并在同一台设备上安装多个操作系统。但是&#xff0c;这…

订单正向链路压测

这次压测会对正向链路中的生订单号、生成订单、预支付、支付回调四个接口做压测&#xff0c;其他接口或逆向接口并发要求不高&#xff0c;所以不做压测。 1、100并发压测4核8G&#xff08;初步压测&#xff0c;看代码是否有问题&#xff09; 压测结果&#xff1a;可以看到&am…

网络协议--IP选路

9.1 引言 选路是IP最重要的功能之一。图9-1是IP层处理过程的简单流程。需要进行选路的数据报可以由本地主机产生&#xff0c;也可以由其他主机产生。在后一种情况下&#xff0c;主机必须配置成一个路由器&#xff0c;否则通过网络接口接收到的数据报&#xff0c;如果目的地址不…

python接口自动化测试(单元测试方法)

一、环境搭建 python unittest requests实现http请求的接口自动化Python的优势&#xff1a;语法简洁优美, 功能强大, 标准库跟第三方库灰常强大&#xff0c;建议大家事先了解一下Python的基础;unittest是python的标准测试库&#xff0c;相比于其他测试框架是python目前使用最广…

MySQL -- 库和表的操作

MySQL – 库和表的操作 文章目录 MySQL -- 库和表的操作一、库的操作1.创建数据库2.查看数据库3.删除数据库4.字符集和校验规则5.校验规则对数据库的影响6.修改数据库7.备份和恢复8.查看连接情况 二、表的操作1.创建表2.查看表结构3.修改表4.删除表 一、库的操作 注意&#xf…

蓝桥杯中级题目之组合(c++)

系列文章目录 数位递增数_睡觉觉觉得的博客-CSDN博客拉线开关。_睡觉觉觉得的博客-CSDN博客蓝桥杯中级题目之数字组合&#xff08;c&#xff09;_睡觉觉觉得的博客-CSDN博客 文章目录 系列文章目录前言一、个人名片二、描述三、输入输出以及代码示例1.输入2.输出3.代码示例 总…

muduo异步日志库

文章目录 一、日志库模型1.前端 参考 一、日志库模型 组成部分 muduo日志库由前端和后端组成。 muduo日志库是异步高性能日志库&#xff0c;其性能开销大约是前端每写一条日志消息耗时1.0us~1.6us。 采用双缓冲区&#xff08;double buffering&#xff09;交互技术。基本思…

蛇口街道小区长者服务示范点 ——在家门口“乐享晚年”

2023年9月28日&#xff0c;深圳市南山区蛇口街道创建健康街道行动之“老年肌少症免费筛查”项目走进了海昌社区&#xff0c;为数十位长者开展了系统筛查。在家门口就能够享受到由蛇口医院康复科医生提供的专业服务&#xff0c;这对于小区的老人们来说还是第一次。自今年7月以来…

【红日靶场】vulnstack5-完整渗透过程

系列文章目录 【红日靶场】vulnstack1-完整渗透过程 【红日靶场】vulnstack2-完整渗透过程 【红日靶场】vulnstack3-完整渗透过程 【红日靶场】vulnstack4-完整渗透过程 文章目录 系列文章目录描述虚拟机密码红队思路 一、环境初始化二、开始渗透外网打点上线cs权限提升域信息…

图(graph)的遍历----深度优先(DFS)遍历

目录 前言 深度优先遍历&#xff08;DFS&#xff09; 1.基本概念 2.算法思想 3.二叉树的深度优先遍历&#xff08;例子&#xff09; 图的深度优先遍历 1.图(graph)邻接矩阵的深度优先遍历 思路分析 代码实现 2.图(graph)邻接表的深度优先遍历 思路分析 代码实现 递…

京东数据分析:2023年9月京东洗烘套装品牌销量排行榜!

鲸参谋监测的京东平台9月份洗烘套装市场销售数据已出炉&#xff01; 根据鲸参谋平台的数据显示&#xff0c;今年9月份&#xff0c;京东平台洗烘套装的销量为7100&#xff0c;环比下降约37%&#xff0c;同比增长约87%&#xff1b;销售额为6000万&#xff0c;环比下降约48%&#…

Rust-后端服务调试入坑记

这篇文章收录于Rust 实战专栏。这个专栏中的相关代码来自于我开发的笔记系统。它启动于是2023年的9月14日。相关技术栈目前包括&#xff1a;Rust&#xff0c;Javascript。关注我&#xff0c;我会通过这个项目的开发给大家带来相关实战技术的分享。 如果你关注过我的Rust 实战里…

Elasticsearch实践:ELK+Kafka+Beats对日志收集平台的实现

可以在短时间内搜索和分析大量数据。 Elasticsearch 不仅仅是一个全文搜索引擎&#xff0c;它还提供了分布式的多用户能力&#xff0c;实时的分析&#xff0c;以及对复杂搜索语句的处理能力&#xff0c;使其在众多场景下&#xff0c;如企业搜索&#xff0c;日志和事件数据分析等…

后台交互-首页->与后台数据进行交互,wsx的使用

与后台数据进行交互wsx的使用 1.与后台数据进行交互 // index.js // 获取应用实例 const app getApp() const apirequire("../../config/app.js") const utilrequire("../../utils/util.js") Page({data: {imgSrcs:[{"img": "https://cd…

ROI的投入产出比是什么?

ROI的投入产出比是什么&#xff1f; 投入产出比&#xff08;Return on Investment, ROI&#xff09;是一种评估投资效益的财务指标&#xff0c;用于衡量投资带来的回报与投入成本之间的关系。它的计算公式如下&#xff1a; 投资收益&#xff1a;指的是投资带来的净收入&#x…

科学指南针iThenticate自助查重系统重磅上线

科学指南针&#xff0c;一直致力于为科研工作者提供高效、专业的学术支持&#xff0c;近日推出了全新的iThenticate自助查重系统。这一系统的上线&#xff0c;旨在为广大科研工作者提供更加便捷、准确的论文查重服务&#xff0c;进一步规范英文使用&#xff0c;提升科研质量。 …

PyTorch 与 TensorFlow:机器学习框架之战

深度学习框架是简化人工神经网络 (ANN) 开发的重要工具&#xff0c;并且其发展非常迅速。其中&#xff0c;TensorFlow 和 PyTorch 脱颖而出&#xff0c;各自在不同的机器学习领域占有一席之地。但如何为特定项目确定理想的工具呢&#xff1f;本综合指南[1]旨在阐明它们的优点和…

WebService SOAP1.1 SOAP1.12 HTTP PSOT方式调用

Visual Studio 2022 新建WebService项目 创建之后启动运行 设置默认文档即可 经过上面的创建WebService已经创建完成&#xff0c;添加HelloWorld3方法&#xff0c; [WebMethod] public string HelloWorld3(int a, string b) { //var s a b; return $"Hello World ab{a …