经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Spring » 查看文章
Spring AOP事务管理的示例详解
来源:jb51  时间:2022/6/20 10:21:39  对本文有异议

转账案例-环境搭建

步骤1:准备数据库表

之前我们在整合Mybatis的时候已经创建了这个表,可以直接使用

  1. create database spring_db character set utf8;
  2. use spring_db;
  3. create table tbl_account(
  4. id int primary key auto_increment,
  5. name varchar(35),
  6. money double
  7. );
  8. insert into tbl_account values(1,'Tom',1000);
  9. insert into tbl_account values(2,'Jerry',1000);

步骤2:创建项目导入jar包

项目的pom.xml添加相关依赖

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework</groupId>
  4. <artifactId>spring-context</artifactId>
  5. <version>5.2.10.RELEASE</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>com.alibaba</groupId>
  9. <artifactId>druid</artifactId>
  10. <version>1.1.16</version>
  11. </dependency>
  12.  
  13. <dependency>
  14. <groupId>org.mybatis</groupId>
  15. <artifactId>mybatis</artifactId>
  16. <version>3.5.6</version>
  17. </dependency>
  18.  
  19. <dependency>
  20. <groupId>mysql</groupId>
  21. <artifactId>mysql-connector-java</artifactId>
  22. <version>5.1.47</version>
  23. </dependency>
  24.  
  25. <dependency>
  26. <groupId>org.springframework</groupId>
  27. <artifactId>spring-jdbc</artifactId>
  28. <version>5.2.10.RELEASE</version>
  29. </dependency>
  30.  
  31. <dependency>
  32. <groupId>org.mybatis</groupId>
  33. <artifactId>mybatis-spring</artifactId>
  34. <version>1.3.0</version>
  35. </dependency>
  36.  
  37. <dependency>
  38. <groupId>junit</groupId>
  39. <artifactId>junit</artifactId>
  40. <version>4.12</version>
  41. <scope>test</scope>
  42. </dependency>
  43.  
  44. <dependency>
  45. <groupId>org.springframework</groupId>
  46. <artifactId>spring-test</artifactId>
  47. <version>5.2.10.RELEASE</version>
  48. </dependency>
  49.  
  50. </dependencies>

步骤3:根据表创建模型类

  1. public class Account implements Serializable {
  2.  
  3. private Integer id;
  4. private String name;
  5. private Double money;
  6. //setter...getter...toString...方法略
  7. }

步骤4:创建Dao接口

  1. public interface AccountDao {
  2.  
  3. @Update("update tbl_account set money = money + #{money} where name = #{name}")
  4. void inMoney(@Param("name") String name, @Param("money") Double money);
  5.  
  6. @Update("update tbl_account set money = money - #{money} where name = #{name}")
  7. void outMoney(@Param("name") String name, @Param("money") Double money);
  8. }

步骤5:创建Service接口和实现类

  1. public interface AccountService {
  2. /**
  3. * 转账操作
  4. * @param out 传出方
  5. * @param in 转入方
  6. * @param money 金额
  7. */
  8. public void transfer(String out,String in ,Double money) ;
  9. }
  10.  
  11. @Service
  12. public class AccountServiceImpl implements AccountService {
  13.  
  14. @Autowired
  15. private AccountDao accountDao;
  16.  
  17. public void transfer(String out,String in ,Double money) {
  18. accountDao.outMoney(out,money);
  19. accountDao.inMoney(in,money);
  20. }
  21.  
  22. }

步骤6:添加jdbc.properties文件

  1. jdbc.driver=com.mysql.jdbc.Driver
  2. jdbc.url=jdbc:mysql://localhost:3306/spring_db?useSSL=false
  3. jdbc.username=root
  4. jdbc.password=root

步骤7:创建JdbcConfig配置类

  1. public class JdbcConfig {
  2. @Value("${jdbc.driver}")
  3. private String driver;
  4. @Value("${jdbc.url}")
  5. private String url;
  6. @Value("${jdbc.username}")
  7. private String userName;
  8. @Value("${jdbc.password}")
  9. private String password;
  10.  
  11. @Bean
  12. public DataSource dataSource(){
  13. DruidDataSource ds = new DruidDataSource();
  14. ds.setDriverClassName(driver);
  15. ds.setUrl(url);
  16. ds.setUsername(userName);
  17. ds.setPassword(password);
  18. return ds;
  19. }
  20. }

步骤8:创建MybatisConfig配置类

  1. public class MybatisConfig {
  2.  
  3. @Bean
  4. public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource){
  5. SqlSessionFactoryBean ssfb = new SqlSessionFactoryBean();
  6. ssfb.setTypeAliasesPackage("com.itheima.domain");
  7. ssfb.setDataSource(dataSource);
  8. return ssfb;
  9. }
  10.  
  11. @Bean
  12. public MapperScannerConfigurer mapperScannerConfigurer(){
  13. MapperScannerConfigurer msc = new MapperScannerConfigurer();
  14. msc.setBasePackage("com.itheima.dao");
  15. return msc;
  16. }
  17. }

步骤9:创建SpringConfig配置类

  1. @Configuration
  2. @ComponentScan("com.itheima")
  3. @PropertySource("classpath:jdbc.properties")
  4. @Import({JdbcConfig.class,MybatisConfig.class})
  5. public class SpringConfig {
  6. }

步骤10:编写测试类

  1. @RunWith(SpringJUnit4ClassRunner.class)
  2. @ContextConfiguration(classes = SpringConfig.class)
  3. public class AccountServiceTest {
  4.  
  5. @Autowired
  6. private AccountService accountService;
  7.  
  8. @Test
  9. public void testTransfer() throws IOException {
  10. accountService.transfer("Tom","Jerry",100D);
  11. }
  12.  
  13. }

事务管理

上述环境,运行单元测试类,会执行转账操作,Tom的账户会减少100,Jerry的账户会加100。

这是正常情况下的运行结果,但是如果在转账的过程中出现了异常,如:

  1. @Service
  2. public class AccountServiceImpl implements AccountService {
  3.  
  4. @Autowired
  5. private AccountDao accountDao;
  6.  
  7. public void transfer(String out,String in ,Double money) {
  8. accountDao.outMoney(out,money);
  9. int i = 1/0;
  10. accountDao.inMoney(in,money);
  11. }
  12.  
  13. }

以上就是Spring AOP事务管理的示例详解的详细内容,更多关于Spring AOP事务管理的资料请关注w3xue其它相关文章!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号