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

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

创建Project并添加数据库依赖

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

图片.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;

图片.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=小说

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

图片.png

看看控制台抛出的异常:

图片.png

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

图片.png

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

图片.png

图片.png

springboot mysql事物_在Spring Boot中使用数据库事务相关推荐

  1. java事务是基于数据库的么_详解在Spring Boot中使用数据库事务

    我们在前面已经分别介绍了如何在spring Boot中使用JPA以及如何在Spring Boot中输出REST资源.那么关于数据库访问还有一个核心操作那就是事务的处理了,前面两篇博客小伙伴们已经见识到 ...

  2. Spring Boot中的多事务管理

    ** 一.多数据源问题 ** 最后一个可以插入一条数据,原因是Transactoinal的事务只针对userMapper有效,因为之前的事务只给test1配置了,而test2并没有配置事务. ** 二 ...

  3. boot spring 接口接收数据_在 Spring Boot 中使用 Dataway 配置数据查询接口

    Dataway介绍 Dataway 是基于 DataQL 服务聚合能力,为应用提供的一个接口配置工具.使得使用者无需开发任何代码就配置一个满足需求的接口. 整个接口配置.测试.冒烟.发布.一站式都通过 ...

  4. springboot拦截html页面元素,Spring Boot 中如何使用拦截器(十五)

    关于拦截器,大家一定都不陌生,spring boot 中是如何使用拦截器的呢?今天就举个例子,来给大家说明一下,废话不多说,开始撸代码!!! 1.创建一个新的spring boot项目,并引入相应的j ...

  5. springboot 分页查询参数_10. Spring Boot 中的分页查询

    在Spring Boot中使用分页查询主要依赖了org.springframework.data.domain.*包下面的及格分页类的功能.使用分页查询常见有两种方式,一种是直接在程序中写死分页的参数 ...

  6. maven项目密码md5加密_加密Spring Boot中的application.properties

    1 概述 什么?都2020年了还在Spring Boot的配置文件中写明文密码? (虽然是小项目,明文也没人看.) (明文简单快捷方便啊!!! ) (你看直接用户名root密码123456多么简单!! ...

  7. springboot指定上下文_修改Spring Boot默认的上下文

    前言 默认情况下,Spring Boot使用的服务上下文为"/",我们可以通过"http://localhost:PORT/" 直接诶访问应用: 但是在生产环境 ...

  8. long mode 分页_在Spring Boot中使用Spring-data-jpa实现分页查询(转)

    在我们平时的工作中,查询列表在我们的系统中基本随处可见,那么我们如何使用jpa进行多条件查询以及查询列表分页呢?下面我将介绍两种多条件查询方式. 1.引入起步依赖 org.springframewor ...

  9. jpa执行mysql存储过程_基于Spring Boot,使用JPA调用Sql Server数据库的存储过程并返回记录集合...

    那么,有些情况,会把一些查询语句写在存储过程中,由存储过程来返回记录集. 在这里就先通过EntityManager创建命名存储过程的方法完成调用. 1.创建SQL存储过程 存储过程返回所有的联系人. ...

最新文章

  1. 使用 JSONP 实现跨域通信,第 2 部分: 使用 JSONP、jQuery 和 Yahoo! 查询语言构建 mashup...
  2. “芯痛”之下阿里苦心研发NPU AI芯片究竟哪款PU更厉害?
  3. pytorch维度统计
  4. 探讨PHP获取checkbox值
  5. Zookeeper详解(一):分布式与Zookeeper
  6. 假设一个半衰期为0的对象
  7. 经典C语言程序100例之五四
  8. MySQL中的pid与socket是什么?
  9. Windows 11 小技巧- winget安装和维护应用程序
  10. dubbo ,dubbo-provider、dubbo-consumer 配置参数说明
  11. CentOS5.5下SVN部署文档
  12. 2019电子科大计算机基础知识,电子科技大学820真题1999-2019终极版.pdf
  13. win8计算机配置怎么看,win8怎么看电脑配置?win8电脑配置的查看方法
  14. EXCEL 跨列居中
  15. 第一周golang学习:--基本数据类型与string字符串类型之间的转换
  16. Flex布局使用总结
  17. UINavigationController 直接pop到指定controllerView的方法
  18. Teechart图表教程:Teechart的组成
  19. 俄罗斯计算机水平_从四点到三十二点。 俄罗斯计算机和网络的早期
  20. 【C语言】求1*2*3*4*5

热门文章

  1. mysql count优化_MySQL count()函数及其优化
  2. 地线与接地螺丝_电气接地的规范要求及接地的各项参数,收藏!
  3. php实现飘窗,JS实现网站图片飘窗效果,JavaScript悬浮广告(附详细代码)
  4. python开发技术文档范文_程序员编写技术文档的新手指南
  5. Linux作者批评英特尔指令集,英特尔回应 Linus Torvalds 对 AVX512 的批评
  6. STL14-set/multiset容器
  7. DataTable操作相关实例
  8. 『 Luogu P3205 』 HNOI2010 合唱队
  9. Centos7安装图形桌面
  10. (转)数字格式化函数:Highcharts.numberFormat()