Spring实现MySQL事务操作
一、创建数据库表
表名:account
字段:(`id`,`username`,`money`)
二、dao、service层创建业务接口、类
1 public interface UserDao { 2 void addMoney(); 3 void reduceMoney(); 4 }
1 @Repository 2 public class UserDaoImpl implements UserDao { 3 4 @Autowired 5 private JdbcTemplate jdbcTemplate; 6 7 @Override 8 public void addMoney() { 9 String sql = "update account set money = money + ? where username = ?"; 10 jdbcTemplate.update(sql,101,"zhangsan"); 11 } 12 13 @Override 14 public void reduceMoney() { 15 String sql = "update account set money = money - ? where username = ?"; 16 jdbcTemplate.update(sql,102,"lisi"); 17 } 18 }
三、注解形式实现事务管理
1 @Service 2 @Transactional 3 public class UserService { 4 5 @Autowired 6 UserDao userDao; 7 8 public void accountMoney() { 9 userDao.reduceMoney(); 10 // 模拟异常 11 int i = 10 / 0; 12 userDao.addMoney(); 13 } 14 }
bean.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:context="http://www.springframework.org/schema/context" 5 xmlns:tx="http://www.springframework.org/schema/tx" 6 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 7 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd 8 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd 9 "> 10 <!-- 数据库连接池 --> 11 <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> 12 <property name="driverClassName" value="com.mysql.jdbc.Driver"></property> 13 <property name="url" value="jdbc:mysql://localhost:3306/test"></property> 14 <property name="username" value="root"></property> 15 <property name="password" value="root"></property> 16 </bean> 17 <!-- JdbcTemplate对象 --> 18 <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> 19 <!--注入dataSource--> 20 <property name="dataSource" ref="dataSource"></property> 21 </bean> 22 <!-- 组件扫描 --> 23 <context:component-scan base-package="com.example"></context:component-scan> 24 25 <!-- 创建事务管理器 --> 26 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 27 <!--注入数据源--> 28 <property name="dataSource" ref="dataSource"></property> 29 </bean> 30 <!-- 开启事务注解 --> 31 <tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven> 32 </beans>
四、XML配置文件实现声明式事务管理
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:context="http://www.springframework.org/schema/context" 5 xmlns:tx="http://www.springframework.org/schema/tx" 6 xmlns:aop="http://www.springframework.org/schema/aop" 7 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 8 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd 9 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd 10 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd 11 "> 12 13 <!-- 数据库连接池 --> 14 <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> 15 <property name="driverClassName" value="com.mysql.jdbc.Driver"></property> 16 <property name="url" value="jdbc:mysql://localhost:3306/test"></property> 17 <property name="username" value="root"></property> 18 <property name="password" value="root"></property> 19 </bean> 20 21 <!-- JdbcTemplate对象 --> 22 <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> 23 <!--注入dataSource--> 24 <property name="dataSource" ref="dataSource"></property> 25 </bean> 26 27 <!-- 组件扫描 --> 28 <context:component-scan base-package="com.example"></context:component-scan> 29 30 <!-- 1. 创建事务管理器 --> 31 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 32 <!--注入数据源--> 33 <property name="dataSource" ref="dataSource"></property> 34 </bean> 35 36 <!-- 2. 配置通知 --> 37 <tx:advice id="txadvice"> 38 <!-- 配置事务参数 --> 39 <tx:attributes> 40 <!-- 指定哪种规则的方法上面添加事务 --> 41 <tx:method name="accountMoney" propagation="REQUIRED"/> 42 <!--<tx:method name="account*"/>--> 43 </tx:attributes> 44 </tx:advice> 45 46 <!-- 3. 配置切入点和切面 --> 47 <aop:config> 48 <!-- 配置切入点 --> 49 <aop:pointcut id="pt" expression="execution(* com.example.demo.service.UserService.*(..))"/> 50 <!-- 配置切面 --> 51 <aop:advisor advice-ref="txadvice" pointcut-ref="pt"></aop:advisor> 52 </aop:config> 53 54 </beans>
五、完全注解实现事务管理
使用配置类代替xml文件
dao、service 使用步骤二、三
1 @Configuration // 配置类 2 @ComponentScan(basePackages = "com.example") // 扫描包 3 @EnableTransactionManagement //开启事务 4 public class TxConfig { 5 6 /** 7 * 创建数据库连接池 8 */ 9 @Bean 10 public DruidDataSource getDruidDataSource() { 11 DruidDataSource dataSource = new DruidDataSource(); 12 dataSource.setDriverClassName("com.mysql.jdbc.Driver"); 13 dataSource.setUrl("jdbc:mysql://localhost:3306/test"); 14 dataSource.setUsername("root"); 15 dataSource.setPassword("root"); 16 return dataSource; 17 } 18 19 /** 20 * 创建JdbcTemplate对象 21 */ 22 @Bean 23 public JdbcTemplate getJdbcTemplate(DataSource dataSource) { 24 // 到IOC容器中根据类型找到dataSource 25 JdbcTemplate jdbcTemplate = new JdbcTemplate(); 26 // 注入dataSource 27 jdbcTemplate.setDataSource(dataSource); 28 return jdbcTemplate; 29 } 30 31 /** 32 * 创建事务管理器 33 */ 34 @Bean 35 public DataSourceTransactionManager getDataSourceTransactionManager(DataSource dataSource) { 36 DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(); 37 transactionManager.setDataSource(dataSource); 38 return transactionManager; 39 } 40 41 }
六、测试
使用xml配置文件实现事务管理时使用 new ClassPathXmlApplicationContext("bean.xml")加载配置文件;
使用完全注解实现事务管理时使用 new AnnotationConfigApplicationContext(TxConfig.class)加载配置类。
1 @Test 2 public void accountTest2() { 3 //完全注解时的测试(加载配置类);xml配置文件测试时使用 new ClassPathXmlApplicationContext("bean.xml")加载配置文件 4 ApplicationContext context = new AnnotationConfigApplicationContext(TxConfig.class); 5 UserService userService = context.getBean("userService", UserService.class); 6 userService.accountMoney(); 7 }