中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

詳解在Spring Boot中使用數據庫事務

發布時間:2020-10-23 07:23:31 來源:腳本之家 閱讀:154 作者:_江南一點雨 欄目:編程語言

我們在前面已經分別介紹了如何在spring Boot中使用JPA以及如何在Spring Boot中輸出REST資源。那么關于數據庫訪問還有一個核心操作那就是事務的處理了,前面兩篇博客小伙伴們已經見識到Spring Boot帶給我們的巨大便利了,其實不用猜,我們也知道Spring Boot在數據庫事務處理問題上也給我們帶來驚喜,OK,廢話不多說,就來看看如何在Spring Boot中使用事務吧。

OK,那我們開始今天愉快的coding旅程吧!

創建Project并添加數據庫依賴

這個沒啥好說的,不懂如何創建一個Spring Boot工程的小伙伴請移步這里初識Spring Boot框架。創建的時候選擇依賴時選擇Web和JPA,如下圖:

詳解在Spring Boot中使用數據庫事務 

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,我們來測試回滾的情況,訪問結果如下:

詳解在Spring Boot中使用數據庫事務 

看看控制臺拋出的異常:

詳解在Spring Boot中使用數據庫事務 

這個時候再去查看數據庫,發現數據表中并沒有插入數據。

再在地址欄輸入http://localhost:8080/norollback?name=sang&age=100,測試結果如下:

瀏覽器依然報錯:

詳解在Spring Boot中使用數據庫事務 

控制臺也打印了錯誤,但是這個時候再去看數據庫,數據已成功插入了。如下圖:

詳解在Spring Boot中使用數據庫事務

OK,以上就是數據庫事務在Spring Boot中的簡單使用。

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

朔州市| 古交市| 密云县| 德庆县| 大港区| 西充县| 丰城市| 乌拉特后旗| 萝北县| 丹巴县| 庄河市| 小金县| 顺平县| 施甸县| 民丰县| 冷水江市| 厦门市| 五家渠市| 定陶县| 靖西县| 江津市| 宁南县| 兴文县| 扶风县| 罗甸县| 桐梓县| 上犹县| 华安县| 额济纳旗| 海门市| 集安市| 宝鸡市| 浦北县| 依兰县| 教育| 梧州市| 铁岭市| 吐鲁番市| 朔州市| 泰州市| 崇州市|