springboot mysql事物_在Spring Boot中使用数据库事务

关于数据库访问还有一个核心操作那就是事务的处理了,前面两篇博客小伙伴们已经见识到Spring Boot带给我们的巨大便利了,其实不用猜,我们也知道Spring Boot在数据库事务处理问题上也给我们带来惊喜,OK,废话不多说,就来看看如何在Spring Boot中使用事务吧。

可能还是会有一些小伙伴对Spring Boot并不是特别熟悉,不熟悉的小伙伴请移步这里从SpringMVC到Spring Boot,老司机请忽略。

创建Project并添加数据库依赖

这个没啥好说的,不懂如何创建一个Spring Boot工程的小伙伴请移步这里初识Spring Boot框架。创建的时候选择依赖时选择Web和JPA,如下图:

ae05674318f6?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

图片.png

org.springframework.boot

spring-boot-starter-data-jpa

mysql

mysql-connector-java

org.mybatis.spring.boot

mybatis-spring-boot-starter

1.3.2

配置application.properties

配置方式还是和前文一模一样,不懂的小伙伴请移步这里初识在Spring Boot中使用JPA,我这里直接贴代码,含义不再赘述:

spring.datasource.url=jdbc:mysql://127.0.0.1/springboot2?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&useSSL=true

spring.datasource.username=root

spring.datasource.password=514730

spring.datasource.driver-class-name=com.mysql.jdbc.Driver

spring.jpa.properties.hibernate.hbm2ddl.auto=update

spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect

spring.jpa.show-sql= true

spring.thymeleaf.cache=false

#中文

spring.http.encoding.charset=UTF-8

spring.http.encoding.force=true

spring.http.encoding.enabled=true

SQL

-- auto-generated definition

CREATE TABLE book

(

id INT AUTO_INCREMENT

PRIMARY KEY,

name VARCHAR(255) NULL,

writer VARCHAR(255) NULL,

introduction VARCHAR(255) NULL

)

ENGINE = InnoDB;

ae05674318f6?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

图片.png

创建实体类

package com.demo.entity;

import javax.persistence.*;

import javax.validation.constraints.Min;

import javax.validation.constraints.NotEmpty;

@Entity

@Table

public class Book {

@Id

@GeneratedValue()

private Long id;

@NotEmpty(message = "姓名不能为空")

@Column(length=50)

private String name;

@NotEmpty(message = "writer不能为空")

private String writer;

@NotEmpty(message = "introduction不能为空")

private String introduction;

public Book() {

}

@Override

public String toString() {

return "Book{" +

"id=" + id +

", name='" + name + '\'' +

", writer='" + writer + '\'' +

", introduction='" + introduction + '\'' +

'}';

}

public 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;

}

public String getWriter() {

return writer;

}

public void setWriter(String writer) {

this.writer = writer;

}

public String getIntroduction() {

return introduction;

}

public void setIntroduction(String introduction) {

this.introduction = introduction;

}

}

创建实体类的Repository

import org.springframework.data.jpa.repository.JpaRepository;

public interface BookDao extends JpaRepository{

}

创建业务服务Service

创建Service接口

package com.demo.service;

import com.demo.entity.Book;

public interface BookService {

public void add(Book book);

public Book savePersonWithRollBack(Book person);

public Book savePersonWithoutRollBack(Book person);

}

创建Service实现类

@Service

@Transactional

public class BookServiceImpl implements BookService {

@Resource

BookDao dao;

public void add(Book book) {

dao.save(book);

}

@Transactional(rollbackFor = {IllegalArgumentException.class})

public Book savePersonWithRollBack(Book person) {

Book book= dao.save(person);

if (person.getName().equals("sang")){

throw new IllegalArgumentException("sang已经存在 数据将回滚");

}

return book;

}

@Transactional(noRollbackFor = {IllegalArgumentException.class})

public Book savePersonWithoutRollBack(Book person) {

Book book= dao.save(person);

if (person.getName().equals("sang")){

throw new IllegalArgumentException("sang已经存在 但数据不会回滚");

}

return book;

}

}

在这里我们使用到了@Transactional注解,该注解中有一个rollbackFor属性,该属性的值为数组,表示当该方法中抛出指定的异常时数据回滚,该注解还有个属性叫noRollbackFor,表示当该方法中抛出指定的异常时数据不回滚,这两个属性我们分别在两个方法中体现。

创建控制器

@RestController

public class BookController2 {

@Autowired

BookService service;

@RequestMapping("/norollback")

public Book noRollback(Book book) {

return service.savePersonWithoutRollBack(book);

}

@RequestMapping("/rollback")

public Book rollback(Book book)

{

return service.savePersonWithRollBack(book);

}

}

控制器创建成功之后接下来我们就可以直接在浏览器中访问这两个地址看看效果了。

测试

首先在浏览器中输入

http://localhost:8080/rollback?name=sang&writer=施耐庵&introduction=小说

我们来测试回滚的情况,访问结果如下:

ae05674318f6?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

图片.png

看看控制台抛出的异常:

ae05674318f6?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

图片.png

这个时候再去查看数据库,发现数据表中并没有插入数据

ae05674318f6?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

图片.png

控制台也打印了错误,但是这个时候再去看数据库,数据已成功插入了。如下图:

ae05674318f6?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

图片.png

ae05674318f6?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

图片.png

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

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

相关文章

什么是JSONP以及它是怎么产生的

什么是JSONP以及它是怎么产生的 1.什么是jsonp JSONP(JSON with Padding)是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问(这仅仅是JSONP简单的实现形式…

cinder连接mysql数据库_Openstack入门篇(十六)之Cinder服务的部署与测试

1.理解块存储服务操作系统获得存储空间的方式一般有两种:通过某种协议(SAS,SCSI,SAN,iSCSI 等)挂接裸硬盘,然后分区、格式化、创建文件系统;或者直接使用裸硬盘存储数据(数据库)通过 NFS、CIFS 等 协议,mount 远程的文件系统第一种…

Mysql经常使用命令

1.导出整个数据库 mysqldump -u username -p --default-character-setlatin1 数据库名 > 导出的文件名称(数据库默认编码是latin1) mysqldump -u wcnc -p smgp_apps_wcnc > wcnc.sql 2.导出一个表 mysqldump -u username -p 数据库名 表名> 导出的文件名称 mysqldump …

stack heap java_java中的Heap 和 Stack | 学步园

1. 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。2. 栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在栈中的数据大小与…

JavaScript密码复杂度

<!DOCTYPE html><html><head lang"en"> <meta charset"UTF-8"> <title>密码复杂度</title></head><body><script type"text/javascript"> //密码复杂度var pwprompt("请输入密…

最后关于Pipeline完整的图如下:

最后关于Pipeline完整的图如下&#xff1a; 转载于:https://www.cnblogs.com/aaa6818162/p/5077988.html

amr 转mp3 java_JAVA 音频转换AMR 转MP3,OS,Linux cent os 7

场景近期在做微信开发时&#xff0c;需要获取用户发给公众服务号的语音留言。而从微信服务端下载来的语音格式却是amr的格式&#xff0c;同样的你手机录音、Android语音等也都是生成amr格式文件。但当你想在web页面去播放此文件时&#xff0c;就困难了。因为无论是当前HTML5的标…

input hidden用法

之前获取数据传数据&#xff0c;都是写在全局变量里&#xff0c;今天老板告诉我说用input hidden来存&#xff0c;我百度了一下&#xff0c;确实是个好方法&#xff0c;记录之&#xff1a; 1 隐藏域在页面中对于用户是不可见的&#xff0c;在表单中插入隐藏域的目的在于收集或发…

java 静态方法 多线程_Java静态方法的线程安全性问题

如果多个线程同时访问同一个静态方法&#xff0c;后一个线程传递的参数值会覆盖前一个线程传递的参数值吗&#xff1f;代码示例如下&#xff1a;被访问的静态资源&#xff1a;public class C {public static void test(String[] value) throws InterruptedException{Thread.sle…

dragloader.js帮助你在页面原生滚动下实现Pull Request操作

dragloader.js是一个面向移动Web开发的JavaScript库&#xff0c;帮助开发者在使用页面原生滚动时&#xff0c;模拟上/下拉手势&#xff0c;实现Pull Request操作。 在移动设备上&#xff0c;一般会使用 drag down 手势实现加载最新 使用 drag up 手势实现加载更多 dragloader样…

怎么运行java虚拟机_Java代码如何运行在Java虚拟机中

我们都知道要运行Java代码就必须要有JRE&#xff0c;也就是Java运行时环境&#xff0c;JRE中包含了Java程序的必需组件&#xff0c;包括Java虚拟机以及Java核心类库&#xff0c;然而运行C代码则不需要额外的运行时环境&#xff0c;只需要把代码编译成CPU能识别的指令即可&#…

java 验证码 添加背景图_java登陆界面怎么加背景图 会的我加你

publicvoiduserInit(){this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置关闭框架的同时结束程序this.setSize(500,300);//设置框架大小为长500,宽300this.setResizable(fa...public void userInit(){this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置关…

【AJAX】AJAX实现搜索信息自己主动推荐并补全

好久没有继续看AJAX的视频教程了,今天就将最后一个教程案例做完。我们在搜索引擎中输入文字时文本框下会提示对应的信息&#xff0c;这个案例就是实现这样的基本功能&#xff0c;代码比較粗糙还须要进一步完好&#xff0c;当中有些地方也须要向大神们请教一下。完毕效果截图&am…

n个骰子的点数 java_n个骰子的点数和为s的概率集合输出(Java)

问题描述&#xff1a;把n个骰子仍在地上&#xff0c;所有骰子朝上一面的点数之和为s,输入n,打印出s的所有可能出现的概率问题分析&#xff1a;这是一道应用动态规划思想的题目&#xff0c;而动态规划最难的就是要找最优子结构。并采取一种称为备忘录的方法避免重复计算。因为备…

2015的最后一天

今天是2015年的以后一天&#xff0c;3点半就要下班了。 也是我毕业&#xff0c;来到这家公司第5个月。 毕业后&#xff0c;去学习php&#xff0c;我喜欢这个&#xff0c;希望通过自己的努力给自己一个未来。 没什么可说的&#xff0c;加油吧&#xff0c;2016&#xff01;&#…

java se是不是java_Java SE和java EE究竟有什么实质上的区别

1、Java SE:Java SE 是Java平台标准版的简称(Java Platform, Standard Edition) (also known as Java 2 Platform) &#xff0c;用于开发和部署桌面、服务器以及嵌入设备和实时环境中的Java应用程序。Java SE包括用于开发Java Web服务的类库&#xff0c;同时&#xff0c;Java S…

使用IntelliJ IDEA 14和Maven创建java web项目

安装Maven 下载安装 去maven官网下载最新版。 解压到安装目录。 配置 右键桌面的计算机图标&#xff0c;属性–>高级系统设置–>环境变量&#xff0c;添加M2_HOME的环境变量&#xff0c;然后将该变量加入的PATH中。 注意 必须要有JAVA_HOME和个环境变量&#xff0c;不然m…

工作那点小事

目录 工作那点小事总结回到顶部工作那点小事 离开了“火龙果”&#xff0c;领导&#xff0c;领导的领导&#xff0c;领导的领导的领导&#xff0c;同事&#xff0c;同事等等&#xff0c;给你上了一堂课。 面试时&#xff0c;问&#xff1a;为什么离开上一家公司&#xff1f;答&…

java textfield赋值_Java中怎么把运行结果显示到textfield中

两种办法:1) 在原有方法里加设置到textfield的命令public static void ipaddress(){try{InetAddress inet InetAddress.getLocalHost();System.out.println(inet.getHostAddress());text1.setText(inet.getHostAddress());//new added}catch(UnknownHostException e){System.e…

01算法 java_蓝桥杯:基础练习 01字串【JAVA算法实现】

题目描述对于长度为5位的一个01串&#xff0c;每一位都可能是0或1&#xff0c;一共有32种可能。它们的前几个是&#xff1a;0000000001000100001100100请按从小到大的顺序输出这32种01串。输入格式本试题没有输入。输出格式输出32行&#xff0c;按从小到大的顺序每行一个长度为…