如何在Springboot中添加事务执行?(以MySQL为例)

目录

1. 添加依赖

2. 配置数据库连接

3. 启用事务管理

4. 创建实体类和存储库

5. 创建服务类并使用@Transactional注解

6. 编写测试用例

7. 运行应用程序


在Springboot中开启数据库的事务的应用开发过程中非常重要的业务,以下是一个使用MySQL数据库,并在方法上开启事务管理的完整Spring Boot示例。

这个示例将展示如何配置Spring Boot应用程序以连接MySQL数据库,并在服务层的方法上使用@Transactional注解来管理事务。

1. 添加依赖

pom.xml文件中添加必要的依赖,包括Spring Data JPA和MySQL驱动程序:

<dependencies><!-- Spring Data JPA --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><!-- MySQL Driver --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><!-- Other dependencies... -->
</dependencies>

2. 配置数据库连接

application.propertiesapplication.yml文件中配置MySQL数据库连接信息。

application.properties:

spring.datasource.url=jdbc:mysql://localhost:3306/testdb
spring.datasource.username=root
spring.datasource.password=yourpassword
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.hibernate.ddl-auto=update
spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect

application.yml:

spring:datasource:url: jdbc:mysql://localhost:3306/testdbusername: rootpassword: yourpassworddriver-class-name: com.mysql.cj.jdbc.Driverjpa:hibernate:ddl-auto: updatedatabase-platform: org.hibernate.dialect.MySQLDialect

3. 启用事务管理

在你的Spring Boot主类或者任何配置类上添加@EnableTransactionManagement注解:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.transaction.annotation.EnableTransactionManagement;@SpringBootApplication
@EnableTransactionManagement
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}

4. 创建实体类和存储库

创建一个简单的用户实体类和对应的存储库接口。

User.java:

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;@Entity
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String name;// Getters and setterspublic Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}

UserRepository.java:

import org.springframework.data.jpa.repository.JpaRepository;public interface UserRepository extends JpaRepository<User, Long> {
}

5. 创建服务类并使用@Transactional注解

在服务层的方法上使用@Transactional注解来管理事务。

UserService.java:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;@Service
public class UserService {@Autowiredprivate UserRepository userRepository;@Transactionalpublic void saveUser(User user) {userRepository.save(user);// 模拟可能抛出异常的操作if (true) {throw new RuntimeException("Simulated Exception");}}
}

6. 编写测试用例

编写一个测试用例来验证事务管理是否正常工作。

UserServiceTest.java:

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.transaction.TransactionSystemException;import static org.junit.jupiter.api.Assertions.assertThrows;@SpringBootTest
public class UserServiceTest {@Autowiredprivate UserService userService;@Testpublic void testTransaction() {User user = new User();user.setName("John");assertThrows(TransactionSystemException.class, () -> {userService.saveUser(user);});}
}

7. 运行应用程序

确保MySQL数据库正在运行,并且数据库testdb已创建。然后运行Spring Boot应用程序,测试用例应该能够验证事务管理是否按预期工作。

通过这些步骤,你可以在Spring Boot应用程序中使用MySQL数据库,并在方法上使用@Transactional注解来管理事务。这样可以确保数据库操作在事务范围内执行,保证数据的一致性和完整性。

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

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

相关文章

Spring Cloud 常用组件——Hystrix(上)

在微服务架构中&#xff0c;服务之间的依赖关系非常复杂&#xff0c;一个服务的故障可能会导致整个系统的级联失败。Hystrix 是 Netflix 开源的一个容错库&#xff0c;它通过隔离服务之间的访问点、添加延迟容忍和容错逻辑来防止系统故障的蔓延。在这篇文章中&#xff0c;我们将…

0803功放3

1.甲乙类互补堆成功放&#xff0c; 理想12v t提供静态偏置&#xff0c;消去交越失真 2.12V Po(12)2/2RL 3.电压并联负反馈 并联减小输入电阻 电压减小输出电阻 4.-Rf/Ri 这个问题是工艺问题引起的&#xff0c;最早用PNP管用的锗管&#xff0c;后面硅工艺成熟后用的就是硅管&…

毫米波移动通信系统中的波束赋形— 基于码本的波束训练

基于码本的波束训练算法该方法在收发端都配置波束矢量的码本&#xff0c;通过波束搜索的方式发现最优的波束方向为了加快波束搜索的速度&#xff0c;往往采用逐步缩小搜索范围的方式加快搜索&#xff0c;可以将搜索算法的时间复杂度从O(N)降低到O(logN)&#xff0c;其中N表示码…

Huffman算法:原理、实现与应用

Huffman算法是一种非常有效的数据压缩算法&#xff0c;它的核心思想是利用字符在源数据中的出现频率来构建一棵Huffman树&#xff0c;从而实现对字符的重新编码。编码过程中&#xff0c;频率越高的字符将获得越短的编码&#xff0c;而频率越低的字符将获得越长的编码。这样&…

信创里程碑:TapData 人大金仓数据库产品完成兼容互认证,携手推进自主创新建设

近日&#xff0c;深圳钛铂数据有限公司&#xff08;以下简称钛铂数据&#xff09;自主研发的钛铂实时数据平台&#xff08;TapData Live Data Platform&#xff0c;TapData LDP&#xff09;与北京人大金仓信息技术股份有限公司&#xff08;以下简称“人大金仓”&#xff09; Ki…

基于单片机的智能浇花系统设计与实现

摘要: 设计了一种智能湿度感应浇花系统 。 系统以单片机 AT89S52 为控制芯片&#xff0c;利用 SLHT5-1 土壤湿度传感器来检测土壤的相对湿度&#xff0c;再通过单片机进行信息处理&#xff0c;采用模糊控制方法&#xff0c;输出控制信号&#xff0c;控制继电器的动作&…

代码随想录训练营第十八天 530二叉搜索树的最小绝对差 501二叉搜索树中的众数 236二叉树的最近公共祖先

第一题&#xff1a; 原题链接&#xff1a;530. 二叉搜索树的最小绝对差 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 使用中序遍历的方式&#xff1a;左中右。 定义一个pre节点来存放当前节点的前一个节点。 在中序的时候处理递归逻辑&#xff1a; 首先先向…

端口发布与暴露

端口发布与暴露 目录 发布端口发布到临时端口发布所有端口试一试 使用 Docker CLI使用 Docker Compose 如果你一直在跟随本指南&#xff0c;你应该理解容器为应用程序的每个组件提供了隔离的进程。每个组件 - 如 React 前端、Python API 和 Postgres 数据库 - 都运行在自己的…

PingCAP 再度入选“中国独角兽企业”,数据库领域的先锋力量

6月16日&#xff0c;2024中国&#xff08;重庆&#xff09;独角兽企业大会上&#xff0c;长城战略咨询发布了《中国独角兽企业研究报告2024》。 2023年&#xff0c;中国独角兽企业共375家&#xff0c;大数据赛道共5家。 估值排序企业名称2023年估值&#xff08;亿美元&#xff…

Huggingface Trainer:Removed shared tensor while saving问题的解决

bug概述&#xff1a;【踩坑记录&#x1f4dd;】Removed shared tensor while saving. 简单来说&#xff0c;这个bug的危害是trainer.save()无法正确存储权重。这篇博文的作者也给出了两种处理方法&#xff0c;但要么要改transformers版本&#xff0c;要么要包裹Trainer类&#…

【面试题】等保(等级保护)的工作流程

等保&#xff08;等级保护&#xff09;的工作流程主要包括以下几个步骤&#xff0c;以下将详细分点介绍&#xff1a; 系统定级&#xff1a; 确定定级对象&#xff1a;根据《信息系统等级保护管理办法》和《信息系统等级保护定级指南》的要求&#xff0c;确定需要进行等级保护的…

CRMEB开源商城系统Java版:新零售时代的技术创新与实战案例

一、引言 随着新零售概念的兴起和电子商务的飞速发展&#xff0c;企业对商城系统的需求也日益多元化和个性化。CRMEB开源商城系统Java版&#xff0c;凭借其先进的技术架构、丰富的功能模块和灵活的扩展性&#xff0c;成为了众多企业构建和扩展自身电商业务的首选。本文将对CRM…

【Android】我的手机在...自己下载...那个(浅析Intent基础运用)

【Android】我的手机在…自己下载…那个&#xff08;浅析Intent基础运用&#xff09; 在Android开发中&#xff0c;Intent&#xff08;意图&#xff09;是一个非常重要的概念。它不仅仅是用于在应用程序的各个组件之间进行通信的工具&#xff0c;也是启动新的Activity、Servic…

表组装示例

代码; #include <gtk-2.0/gtk/gtk.h> #include <glib-2.0/glib.h> #include <stdio.h>int main(int argc, char *argv[]) {gtk_init(&argc, &argv);GtkWidget *window;window gtk_window_new(GTK_WINDOW_TOPLEVEL);gtk_window_set_title(GTK_WINDO…

光伏能源圈

2021年&#xff0c;新型电力系统之下&#xff0c;中国已形成了两网五大六小的电力新格局&#xff1a; 两大电网&#xff1a;国家电网、南方电网 五大电力央企&#xff1a;国家能源投资集团、中国华能集团、中国华电集团、中国大唐集团、国家电力投资集团。 六小豪门&#xf…

python判断语句

目录 布尔类型和比较运算符if语句的基本格式if else 语句if elif else 语句判断语句的嵌套 布尔类型和比较运算符 1、布尔类型 bool布尔类型只有两个结果&#xff1a;真或假 布尔类型的字面量&#xff1a; True 表示真&#xff08;是、肯定&#xff09; False 表示假&#x…

一切前端概念,都是纸老虎

4、listener可以通过 store.getState() 得到当前状态。如果使用的是 React&#xff0c;这时可以触发重新渲染 View。 function listerner() { let newState store.getState(); component.setState(newState); } 对比 Flux 和 Flux 比较一下&#xff1a;Flux 中 Store 是…

ChatGPT API教程在线对接OpenAI APIKey技术教程

一、OpenAI基本库介绍 您可以通过 HTTP 请求与 API 进行交互&#xff0c;这可以通过任何编程语言实现。我们提供官方的 Python 绑定、官方的 Node.js 库&#xff0c;以及由社区维护的库。 要安装官方的 Python 绑定&#xff0c;请运行以下命令&#xff1a; pip install open…

【总结】在SpringBoot项目中如何动态切换数据源、数据库?(可直接CV)

注意&#xff1a;文章若有错误的地方&#xff0c;欢迎评论区里面指正 &#x1f36d; 前言 本文参考若依源码&#xff0c;介绍了如何在SpringBoot项目中使用AOP和自定义注解实现MySQL主从数据库的动态切换&#xff0c;当从库故障时&#xff0c;能自动切换到主库&#xff0c;确…

1-什么是自动驾驶?

自动驾驶&#xff08;Autonomous Driving&#xff09;是指利用计算机系统来实现车辆的自主控制&#xff0c;使车辆能够在没有人类司机的情况下安全行驶的技术。自动驾驶车辆通常配备有多种传感器&#xff0c;如雷达&#xff08;Radar&#xff09;、激光雷达&#xff08;Lidar&a…