詳解在Spring?Boot中使用數(shù)據(jù)庫事務(wù)
我們在前面已經(jīng)分別介紹了如何在spring Boot中使用JPA以及如何在Spring Boot中輸出REST資源。那么關(guān)于數(shù)據(jù)庫訪問還有一個核心操作那就是事務(wù)的處理了,前面兩篇博客小伙伴們已經(jīng)見識到Spring Boot帶給我們的便利了,其實不用猜,我們也知道Spring Boot在數(shù)據(jù)庫事務(wù)處理問題上也給我們帶來驚喜,OK,廢話不多說,就來看看如何在Spring Boot中使用事務(wù)吧。
OK,那我們開始今天愉快的coding旅程吧!
創(chuàng)建Project并添加數(shù)據(jù)庫依賴
這個沒啥好說的,不懂如何創(chuàng)建一個Spring Boot工程的小伙伴請移步這里初識Spring Boot框架。創(chuàng)建的時候選擇依賴時選擇Web和JPA,如下圖:

OK,工程創(chuàng)建成功之后接下來我們來添加數(shù)據(jù)庫驅(qū)動,和前文一樣,我這里還是以MySQL數(shù)據(jù)庫為例,在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
創(chuàng)建實體類
實體類還是一個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;
}
}
創(chuàng)建實體類的Repository
public interface PersonRepository extends JpaRepository<Person,Long> {
}這里因為我們的目的是測試事務(wù),所以Repository中暫時先不寫任何東西。
創(chuàng)建業(yè)務(wù)服務(wù)Service
創(chuàng)建Service接口
public interface DemoService {
public Person savePersonWithRollBack(Person person);
public Person savePersonWithoutRollBack(Person person);
}
創(chuàng)建Service實現(xiàn)類
@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 已存在,數(shù)據(jù)將回滾");
}
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已存在,但數(shù)據(jù)不會回滾");
}
return p;
}
}
在這里我們使用到了@Transactional注解,該注解中有一個rollbackFor屬性,該屬性的值為數(shù)組,表示當該方法中拋出指定的異常時數(shù)據(jù)回滾,該注解還有個屬性叫noRollbackFor,表示當該方法中拋出指定的異常時數(shù)據(jù)不回滾,這兩個屬性我們分別在兩個方法中體現(xiàn)。
創(chuàng)建控制器
@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);
}
}
控制器創(chuàng)建成功之后接下來我們就可以直接在瀏覽器中訪問這兩個地址看看效果了。
測試
首先在瀏覽器中輸入http://localhost:8080/rollback?name=sang&age=100,我們來測試回滾的情況,訪問結(jié)果如下:

看看控制臺拋出的異常:

這個時候再去查看數(shù)據(jù)庫,發(fā)現(xiàn)數(shù)據(jù)表中并沒有插數(shù)據(jù)。
再在地址欄輸入http://localhost:8080/norollback?name=sang&age=100,測試結(jié)果如下:
瀏覽器依然報錯:

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

OK,以上就是數(shù)據(jù)庫事務(wù)在Spring Boot中的簡單使用。
本文案例GitHub地址https://github.com/lenve/JavaEETest/tree/master/Test24-Transaction。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Springboot通過谷歌Kaptcha?組件生成圖形驗證碼功能
Kaptcha是谷歌開源的一款簡單實用的圖形驗證碼組件。我個人推薦它的最大原因是容易上手,采用約定大于配置的方式,快速契合到項目中,這篇文章主要介紹了Springboot通過谷歌Kaptcha組件生成圖形驗證碼的方法,需要的朋友可以參考下2023-05-05
詳解Springboot應(yīng)用中設(shè)置Cookie的SameSite屬性
Chrome 51 開始,瀏覽器的 Cookie 新增加了一個SameSite屬性,用來防止 CSRF 攻擊和用戶追蹤。今天通過本文給大家介紹Springboot應(yīng)用中設(shè)置Cookie的SameSite屬性,感興趣的朋友一起看看吧2022-01-01
Java字符串相關(guān)類StringBuffer的用法詳解
java.lang包下的StringBuffer類,代表著可變的字符序列,可以用來對字符串內(nèi)容進行增刪改操作。本文將通過示例詳細說說它的用法,感興趣的可以跟隨小編一起學習一下2022-10-10
Spring Data JPA實現(xiàn)排序與分頁查詢超詳細流程講解
在介紹Spring Data JPA的時候,我們首先認識下Hibernate。Hibernate是數(shù)據(jù)訪問解決技術(shù)的絕對霸主,使用O/R映射技術(shù)實現(xiàn)數(shù)據(jù)訪問,O/R映射即將領(lǐng)域模型類和數(shù)據(jù)庫的表進行映射,通過程序操作對象而實現(xiàn)表數(shù)據(jù)操作的能力,讓數(shù)據(jù)訪問操作無須關(guān)注數(shù)據(jù)庫相關(guān)的技術(shù)2022-10-10
SpringBoot集成內(nèi)存數(shù)據(jù)庫hsqldb的實踐
hsqldb只需要添加對應(yīng)的依賴,然后在配置文件進行配置。不需要安裝一個數(shù)據(jù)庫,本文就來介紹一下具體使用,感興趣的可以了解一下2021-09-09
java ReentrantLock條件鎖實現(xiàn)原理示例詳解
這篇文章主要為大家介紹了java ReentrantLock條件鎖實現(xiàn)原理示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-01-01

