spring 注解如何開啟聲明式事務
spring開啟聲明式事務
導入依賴
pom.xml
<dependencies> ? ? ? ? <!-- https://mvnrepository.com/artifact/org.springframework/spring-context --> ? ? ? ? <!--spring依賴--> ? ? ? ? <dependency> ? ? ? ? ? ? <groupId>org.springframework</groupId> ? ? ? ? ? ? <artifactId>spring-context</artifactId> ? ? ? ? ? ? <version>4.3.12.RELEASE</version> ? ? ? ? </dependency> ? ? ? ? <!--單元測試依賴--> ? ? ? ? <dependency> ? ? ? ? ? ? <groupId>junit</groupId> ? ? ? ? ? ? <artifactId>junit</artifactId> ? ? ? ? ? ? <version>4.13</version> ? ? ? ? ? ? <scope>test</scope> ? ? ? ? </dependency> ? ? ? ? <!--mysql驅動--> ? ? ? ? <dependency> ? ? ? ? ? ? <groupId>mysql</groupId> ? ? ? ? ? ? <artifactId>mysql-connector-java</artifactId> ? ? ? ? ? ? <version>8.0.21</version> ? ? ? ? </dependency> ? ? ? ? <!-- https://mvnrepository.com/artifact/c3p0/c3p0 --> ? ? ? ? <!--c3p0數據源--> ? ? ? ? <dependency> ? ? ? ? ? ? <groupId>c3p0</groupId> ? ? ? ? ? ? <artifactId>c3p0</artifactId> ? ? ? ? ? ? <version>0.9.1.2</version> ? ? ? ? </dependency> ? ? ? ? <!--spring jdbc spring操作數據庫--> ? ? ? ? <dependency> ? ? ? ? ? ? <groupId>org.springframework</groupId> ? ? ? ? ? ? <artifactId>spring-jdbc</artifactId> ? ? ? ? ? ? <version>4.3.12.RELEASE</version> ? ? ? ? </dependency> ? ? </dependencies>
操作數據庫需要配置數據源,spring提供的操作數據庫的JdbcTemplate創(chuàng)建時需要傳入數據源,事務管理器創(chuàng)建時也需要傳入數據源,然后將數據源,JdbcTemplate,事務管理器注冊到容器中
具體代碼如下:
配置類文件
SpringTxConfig.java
package com.sixteen.tx; import com.mchange.v2.c3p0.ComboPooledDataSource; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; import javax.sql.DataSource; import java.beans.PropertyVetoException; @ComponentScan(basePackages = {"com.sixteen.tx"})//包掃描 @Configuration @EnableTransactionManagement//開啟基于注解的聲明式事務 public class SpringTxConfig { ?? ?//注冊數據源 ? ? @Bean ? ? public DataSource dataSource() throws PropertyVetoException { ? ? ? ? ComboPooledDataSource dataSource = new ComboPooledDataSource(); ? ? ? ? dataSource.setDriverClass("com.mysql.cj.jdbc.Driver"); ? ? ? ? dataSource.setPassword("123456"); ? ? ? ? dataSource.setUser("root"); ? ? ? ? dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/jdbc?serverTimezone=Asia/Shanghai&useSSL=true&useUnicode=true&characterEncoding=UTF-8"); ? ? ? ? return dataSource; ? ? } ?? ?//注冊JdbcTemplate ? ? @Bean ? ? public JdbcTemplate jdbcTemplate() throws PropertyVetoException { ? ? ? ? //兩種方法獲取DataSource ? ? ? ? //1. 直接在方法放置參數 public JdbcTemplate jdbcTemplate(DataSource dataSource) ? ? ? ? // ? ? ?默認會去容器中獲取 ? ? ? ? //2. 如下: 調用上面的方法 ? ? ? ? //spring對@Configuration類有特殊處理,注冊組件的方法多次調用只是在IOC容器中找組件 ? ? ? ? return new JdbcTemplate(dataSource()); ? ? } ? ? //注冊事務管理器 ? ? @Bean ? ? public PlatformTransactionManager transactionManager() throws PropertyVetoException { ? ? ? ? return new DataSourceTransactionManager(dataSource());//需要傳入dataSource ? ? } }
ps: 我用的mysql是8.0+版本,編寫jdbcUrl時至少需要附帶時區(qū)參數:serverTimezone=Asia/Shanghai
在此之前需要在mysql數據庫中建一張普通的User表,如下所示:(id自增)
id | name |
---|---|
1 | zhangsan |
業(yè)務邏輯編寫
UserDao.java
package com.sixteen.tx; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Repository; import java.util.UUID; @Repository public class UserDao { @Autowired private JdbcTemplate jdbcTemplate; public void insert(){ String sql = "INSERT INTO `user`(name) VALUES(?)"; String name = UUID.randomUUID().toString().substring(0, 5); jdbcTemplate.update(sql,name); } }
UserService.java
package com.sixteen.tx; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service public class UserService { ? ? @Autowired ? ? private UserDao userDao; ? ? @Transactional ? ? public void insertUser(){ ? ? ? ? userDao.insert(); ? ? ? ? System.out.println("插入完成"); ? ? ? ? //故意制造錯誤,使事務生效,進行回滾 ? ? ? ? int i = 10/0; ? ? } }
測試代碼
SpringTxTest.java
package com.sixteen.test; import com.sixteen.tx.SpringTxConfig; import com.sixteen.tx.UserService; import org.junit.Test; import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class SpringTxTest { ? ? @Test ? ? public void testInsert(){ ? ? ? ? AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringTxConfig.class); ? ? ? ? UserService service = context.getBean(UserService.class); ? ? ? ? service.insertUser(); ? ? } }
總結
以上就是spring如何用注解方式開啟聲明式事務,細節(jié)之處可能沒有講到,但基本的實現還是有的,若有不足之處望見諒并指出。
這些僅為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
mybatis教程之resultmap_動力節(jié)點Java學院整理
這篇文章主要介紹了mybatis教程之resultmap,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-09-09Spring Cloud 整合Apache-SkyWalking實現鏈路跟蹤的方法
這篇文章主要介紹了Spring Cloud 整合Apache-SkyWalking鏈路跟蹤的示例代碼,代碼簡單易懂,通過圖文相結合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06MyEclipse如何將項目的開發(fā)環(huán)境與服務器的JDK 版本保持一致
我們使用MyEclipse開發(fā)Java項目開發(fā)中,偶爾會遇到因項目開發(fā)環(huán)境不協調,導致這樣那樣的問題,在這里以把所有環(huán)境調整為JDK1.6 為例,給大家詳細介紹MyEclipse如何將項目的開發(fā)環(huán)境與服務器的JDK 版本保持一致,需要的朋友參考下吧2024-04-04rocketmq的AclClientRPCHook權限控制使用技巧示例詳解
這篇文章主要為大家介紹了rocketmq的AclClientRPCHook使用技巧示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08