本章使用c3p0做演示
方法一,编辑试事务
开启事务核心类 DataSourceTransactionManager,不管是哪一种方式都需要创建该对象,该方式需要记住的类 TransactionTemplate,
其实很好记,使用spring操作数据库创建jdbcTemplate ,使用spring开启事务创建TransactionTemplate
public class Transaction_01 {
public void Test_demo() throws PropertyVetoException {
//创建Spring提供的事务模板
TransactionTemplate template = new TransactionTemplate();
//创建c3p0连接池
ComboPooledDataSource dataSource = new ComboPooledDataSource();
//设置数据库账号
dataSource.setUser("root");
//设置密码
dataSource.setPassword("1039191520");
//设置驱动
dataSource.setDriverClass("com.mysql.jdbc.Driver");
//设置url
dataSource.setJdbcUrl("jdbc:mysql:///springTransaction");
//创建数据库管理员
DataSourceTransactionManager manager = new DataSourceTransactionManager();
//封装参数
manager.setDataSource(dataSource);
//设置管理员
template.setTransactionManager(manager);
// 开启事务
template.execute(new TransactionCallback<Object>() {
@Override
public Object doInTransaction(TransactionStatus transactionStatus) {
try {
//创建jdbcTemplate来操作数据库
JdbcTemplate jdbcTemplate = new JdbcTemplate();
jdbcTemplate.setDataSource(dataSource);
//编写sql
String sql = "insert into dNmae values('zs')";
// 执行sql
jdbcTemplate.update(sql);
} catch (DataAccessException e) {
e.printStackTrace();
//回滚事务
transactionStatus.setRollbackOnly();
}
return null; //doInTransaction : 表示这个方法是在事务内容执行
}
});
}
}
注解式事务(AOP方式)
创建一个需要开启事务的演示类
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class demo {
@Autowired
private JdbcTemplate jdbc;
@Test
public void save(){
//编写sql
String sql = "insert into table_name values('ws')";
jdbc.update(sql);
}
}
配置xml
<!--创建数据库实例-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="url" value="jdbc:mysql:///spring_day04"/>
<property name="username" value="root"/>
<property name="password" value="1039191520"/>
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
</bean>
<!--创建jdbc模板-->
<bean id="jdbc" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--必须创建数据库管理者-->
<bean id="manager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--设置数据库属性-->
<property name="dataSource" ref="dataSource"/>
</bean>
<tx:advice id="advice" transaction-manager="manager">
<!-- 这段代码的意思就是: 到底前面的表达式找到的方法,哪些才能用事务?
save 表示,前面的表达式找到的所有方法都用事务管理
如果只写了一个save , 表示前面的表达式如果找到1万个方法,但是也只能有save方法用事务管理起来。
-->
<tx:attributes>
<tx:method name="save" />
</tx:attributes>
</tx:advice>
<!--使用aop-->
<aop:config >
<!--创建切入点-->
<aop:pointcut id="transaction" expression="execution(* cn.itcast.demo.demo.*(..))"/>
<aop:advisor advice-ref="advice" pointcut-ref="transaction"/>
</aop:config>
以上俩种方法都是很麻烦的,spring怕没有人使用,就创建了一种很简单的用法,
开发中常用的开启事务方式
<!--创建数据库实例-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="url" value="jdbc:mysql:///spring_day04"/>
<property name="username" value="root"/>
<property name="password" value="1039191520"/>
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
</bean>
<!--创建jdbc模板-->
<bean id="jdbc" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--必须创建数据库管理者-->
<bean id="manager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--设置数据库属性-->
<property name="dataSource" ref="dataSource"/>
</bean>
<tx:annotation-driven transaction-manager="manager"/>
编写测试类 (只需要在测试类上加上注解(@Transactional)即可)
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
@Transactional
public class demo {
@Autowired
private JdbcTemplate jdbc;
@Test
public void save(){
String sql = "insert into table_name values('ws')";
jdbc.update(sql);
}
}
以上就是spring提供的注解方式,第一种第二种都是纯了解的,,,开发不会有人用的,所以只需要记第三种就行