實現Spring聲明式事務步驟:
以下爲具體代碼實現:
1、代碼結構
2、pom文件導入依賴jar包
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.3.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>4.3.8.RELEASE</version>
</dependency>
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.30</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.8.RELEASE</version>
</dependency>
3、創建業務邏輯代碼
/**
* Created by qing.zhao on 2020/3/18.
* 業務層
*/
@Service
public class ProductServiceImpl {
@Autowired
private ProductDao productDao;
public void insertProduct(Product product){
productDao.insertProduct(product.getProductSkn(), product.getProductName());
System.out.println("插入成功!");
}
}
/**
* Created by qing.zhao on 2020/3/18.
* 創建並執行sql語句
*/
@Repository
public class ProductDao {
@Autowired
private JdbcTemplate jdbcTemplate;
@Transactional
public void insertProduct(Integer skn, String name){
String insertSql = "insert into product(productSkn,productName) values (?, ?)";
//步驟1:插入商品數據
jdbcTemplate.update(insertSql, skn, name);
//模仿其他步驟出錯場景
// int i = 10/0;
}
}
/**
* Created by qing.zhao on 2020/3/18.
* 商品屬性
*/
public class Product {
private Integer productSkn;
private String productName;
public Product() {
}
public Product(Integer productSkn, String productName) {
this.productSkn = productSkn;
this.productName = productName;
}
public Integer getProductSkn() {
return productSkn;
}
public void setProductSkn(Integer productSkn) {
this.productSkn = productSkn;
}
public String getProductName() {
return productName;
}
public void setProductName(String productName) {
this.productName = productName;
}
}
4、配置類代碼
/**
* Created by qing.zhao on 2020/3/18.
* 配置類相當於bean.xml
*/
@Configuration
@ComponentScan(value = "com.qing.zhao.*")
@Import({JdbcTemplateConfig.class, TransactionManager.class})
@EnableTransactionManagement
public class ProductConfigation {
}
/**
* Created by qing.zhao on 2020/3/18.
* 數據庫相關配置
*/
public class JdbcTemplateConfig {
@Bean
public JdbcTemplate createJdbcTemplate(DataSource dataSource){
return new JdbcTemplate(dataSource);
}
@Bean
public DataSource dataSource(){
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUsername("root");
dataSource.setPassword("11111111");
dataSource.setUrl("jdbc:mysql://localhost:3306/test");
return dataSource;
}
}
/**
* Created by qing.zhao on 2020/3/18.
* 事務管理器
*/
public class TransactionManager {
@Bean
public PlatformTransactionManager dtManager(DataSource dataSource){
return new DataSourceTransactionManager(dataSource);
}
}
5、測試類
/**
* Hello world!
* 測試類
*/
public class App
{
public static void main( String[] args ) throws Exception {
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(ProductConfigation.class);
ProductServiceImpl productService = applicationContext.getBean(ProductServiceImpl.class);
System.out.println( "Hello World!" );
Product product = new Product();
product.setProductName("qingQing1");
product.setProductSkn(1234567);
productService.insertProduct(product);
}
}
6、結果
-
無異常插入成功
表中數據已插入
-
有異常回滾
數據未插入成功,已回滾