在spring中经常用TransactionProxyFactoryBean完成声明式事务管理
使用TransactionProxyFactoryBean 需要注入它所依赖的事务管理器,设置代理的目标对象,代理对象的生成方式和事务属性.代理对象时再目标对象上生成的包含事务和AOP切面的新对象,它可以赋给目标的引用来替代目标对象,以支持事务或AOP提供的切面功能
利用TransactionPrxyFactory来实现spring声明式事务管理
首先,在配置文件中定义数据源和事务管理器.
<!-- 配置数据源 --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"></property> <property name="url" value="jdbc:mysql://localhost:3306/hibernate"></property> <property name="username" value="root"></property> <property name="password" value="123456"></property> </bean> <!-- 定义事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> <!-- 声明式的事务 --> <bean id="transaction" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="transactionManager" ref="transactionManager"></property> <property name="target"> <bean id="addDao" class="transaction.AddDao"> <property name="dataSource" ref="dataSource"></property> </bean> </property> <property name="proxyTargetClass" value="true"></property> <property name="transactionAttributes"> <props> <prop key="add*">PROPAGATION_REQUIRED</prop> </props> </property> </bean>
编写操作数据库的AddDao类,同时编写addUser()函数,在该函数中一次性实现两次数据的插入操作
public class AddDao extends JdbcDaoSupport { public void addUser(User user){ String sql="insert into mw_person(name,age)values('"+user.getUsername()+"',"+23+")"; getJdbcTemplate().execute(sql); getJdbcTemplate().execute(sql); } }
测试类:
public class Test { public static void main(String[] args) { Resource resource=new ClassPathResource("transaction/beam.xml"); BeanFactory factory=new XmlBeanFactory(resource); AddDao addDao=(AddDao)factory.getBean("transaction"); User user=new User(); user.setUsername("abc"); user.setAge(34); addDao.addUser(user); } }