详解在Spring Boot中使用数据库事务

 更新时间:2017年05月19日 11:39:05   作者:_江南一点雨  
本篇文章主要介绍了详解在Spring Boot中使用数据库事务,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

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

OK,那我们开始今天愉快的coding旅程吧!

创建Project并添加数据库依赖

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

 

OK,工程创建成功之后接下来我们来添加数据库驱动,和前文一样,我这里还是以MySQL数据库为例,在pom.xml文件中添加如下依赖:

<dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.40</version>
    </dependency>

配置application.properties

配置方式还是和前文一模一样,我这里直接贴代码,含义不再赘述:

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/rest
spring.datasource.username=root
spring.datasource.password=sang

spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jackson.serialization.indent_output=true

创建实体类

实体类还是一个Person,如下:

@Entity
public class Person {
  @Id
  @GeneratedValue
  private Long id;
  private String name;
  private String address;
  private Integer age;

  public Person() {
  }

  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 getAddress() {
    return address;
  }

  public void setAddress(String address) {
    this.address = address;
  }

  public Integer getAge() {
    return age;
  }

  public void setAge(Integer age) {
    this.age = age;
  }

  public Person(Long id, String name, String address, Integer age) {
    this.id = id;
    this.name = name;
    this.address = address;
    this.age = age;
  }
}

创建实体类的Repository

public interface PersonRepository extends JpaRepository<Person,Long> {
}

这里因为我们的目的是测试事务,所以Repository中暂时先不写任何东西。

创建业务服务Service

创建Service接口

public interface DemoService {
  public Person savePersonWithRollBack(Person person);

  public Person savePersonWithoutRollBack(Person person);
}

创建Service实现类

@Service
public class DemoServiceImpl implements DemoService {
  @Autowired
  PersonRepository personRepository;

  @Transactional(rollbackFor = {IllegalArgumentException.class})
  @Override
  public Person savePersonWithRollBack(Person person) {
    Person p = personRepository.save(person);
    if (person.getName().equals("sang")) {
      throw new IllegalArgumentException("sang 已存在,数据将回滚");
    }
    return p;
  }

  @Transactional(noRollbackFor = {IllegalArgumentException.class})
  @Override
  public Person savePersonWithoutRollBack(Person person) {
    Person p = personRepository.save(person);
    if (person.getName().equals("sang")) {
      throw new IllegalArgumentException("sang已存在,但数据不会回滚");
    }
    return p;
  }
}

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

创建控制器

@RestController
public class MyController {
  @Autowired
  private DemoService demoService;

  @RequestMapping("/norollback")
  public Person noRollback(Person person) {
    return demoService.savePersonWithoutRollBack(person);
  }

  @RequestMapping("/rollback")
  public Person rollback(Person person) {
    return demoService.savePersonWithRollBack(person);
  }
}

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

测试

首先在浏览器中输入http://localhost:8080/rollback?name=sang&age=100,我们来测试回滚的情况,访问结果如下:

 

看看控制台抛出的异常:

 

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

再在地址栏输入http://localhost:8080/norollback?name=sang&age=100,测试结果如下:

浏览器依然报错:

 

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

OK,以上就是数据库事务在Spring Boot中的简单使用。

本文案例GitHub地址https://github.com/lenve/JavaEETest/tree/master/Test24-Transaction

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • java 取模与取余的区别说明

    java 取模与取余的区别说明

    这篇文章主要介绍了java 取模与取余的区别说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • Java编程中的检查型异常与非检查型异常分析

    Java编程中的检查型异常与非检查型异常分析

    这篇文章主要介绍了Java编程中的未检查型异常与非检查型异常,以及异常的处理方式,需要的朋友可以参考下
    2017-09-09
  • SpringBoot集成Druid配置(yaml版本配置文件)详解

    SpringBoot集成Druid配置(yaml版本配置文件)详解

    这篇文章主要介绍了SpringBoot集成Druid配置(yaml版本配置文件),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • java基础之注解示例详解

    java基础之注解示例详解

    大家好,本篇文章主要讲的是java基础之注解示例详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • Java实现租车管理系统

    Java实现租车管理系统

    这篇文章主要为大家详细介绍了Java实现租车管理系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • myeclipse无法部署项目问题及解决方法

    myeclipse无法部署项目问题及解决方法

    最近小编遇到到棘手的问题,myeclipse无法部署项目,点击这个部署按钮没有反应。怎么解决呢,下面小编给大家代理的myeclipse无法部署项目问题及解决方法 ,感兴趣的朋友一起看看吧
    2018-10-10
  • Java老矣 尚能饭否?

    Java老矣 尚能饭否?

    Java老矣,尚能饭否?各类编程语言横空出世,纷战不休,然而 TIOBE 的语言排行榜上,Java 却露出了明显的颓势。这个老牌的语言,未来会是怎样?
    2017-06-06
  • Java 中的注解详解及示例代码

    Java 中的注解详解及示例代码

    本文主要介绍Java 中的注解,这里提供了详细的相关资料,及示例代码,帮助大家学习理解,有兴趣的小伙伴可以参考下
    2016-08-08
  • 2020最新eclipse安装过程及细节

    2020最新eclipse安装过程及细节

    这篇文章主要介绍了2020最新eclipse安装过程及细节,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • springboot使用自定义注解实现aop切面日志

    springboot使用自定义注解实现aop切面日志

    这篇文章主要为大家详细介绍了springboot使用自定义注解实现aop切面日志,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-09-09

最新评论