实现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、结果
-
无异常插入成功
表中数据已插入
-
有异常回滚
数据未插入成功,已回滚