Spring引入事务
方式一:使用Jdbc动态代理方式,需要使用接口
<!-- Spring JDBC:可以像DbUtils一样操作数据库 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.18</version>
</dependency>
配置Spring信息
<!-- 自动扫描 -->
<context:component-scan base-package="com.xxx"/>
<!-- 导入数据库连接属性文件 -->
<context:property-placeholder location="classpath:/mysql.properties"/>
<!-- 配置可以使用具名参数的JDBCTemplate类对象 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!-- 没有无参构造器,必须传入数据源或JdbcTemplate对象 -->
<constructor-arg ref="dataSource"/>
</bean>
<!-- 添加事务管理器组件DataSourceTransactionManager -->
<bean id="tx" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 开启基于注解的声明式事务-->
<tx:annotation-driven transaction-manager="tx"/>
接口类:BrandDao.java
import javax.transaction.Transactional;
import java.sql.SQLException;
/**
* @author JngKang
* @date 2022-05-10 10:54
*/
public interface BrandDao {
@Transactional
Integer insert() throws SQLException;
}
实现类:BrandDaoImpl.java
import com.xxx.dao.BrandDao;
import org.springframework.stereotype.Repository;
import javax.annotation.Resource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
/**
* @author JngKang
* @date 2022-05-10 10:54
*/
@Repository("brandDao")
public class BrandDaoImpl implements BrandDao {
@Resource
private JdbcTemplate jdbcTemplate;
@Override
public Integer insert() throws SQLException {
int res = jdbcTemplate.update("insert into tb_brand(name, logo) values('aaa', 'bbb')");
System.out.println(3 / 0);
return res;
}
}
测试类:
import com.xxx.dao.BrandDao;
import com.xxx.dao.impl.BrandDaoImpl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.sql.SQLException;
/**
* @author JngKang
* @date 2022-05-09 09:49
*/
public class TestDemo {
public static void main(String[] args) throws SQLException {
ApplicationContext act = new ClassPathXmlApplicationContext("applicationContext.xml");
BrandDao brandDao = (BrandDao) act.getBean("brandDao");
System.out.println(brandDao.insert());
}
}
运行截图:
正确:
错误:
方式二:使用cglib动态代理:不需要接口
未测试