当前位置:   article > 正文

Spring 事务配置类,完成数据库的转账

Spring 事务配置类,完成数据库的转账

1、完成基本的三层架构

1.1创建Account表

创建实体类 Account

1.2 Service层写入 AccountService 接口

Service层 下写 impl 包定义 AccountServiceImpl 类 实现接口 AccountService

  1. @Service
  2. @Transactional
  3. @RequiredArgsConstructor
  4. public class AccountServiceImpl implements AccountService {
  5. private final AccountDao accountDao;
  6. // @Transactional 事务注解可以写再方法上,也可以写类上
  7. @Override
  8. public boolean transfer(String from, String to, double money) {
  9. //获取转入账号信息
  10. Account toAccount = accountDao.getAccountByAccount(to);
  11. if (toAccount == null) {
  12. System.out.println("账号不存在");
  13. return false;
  14. }
  15. if (toAccount.getStatus() == 1) {
  16. System.out.println("被禁用");
  17. return false;
  18. }
  19. //获取转出账号信息
  20. Account fromAccount = accountDao.getAccountByAccount(from);
  21. if (fromAccount.getMoney() <= money) {
  22. System.out.println("转出账号余额不足");
  23. return false;
  24. }
  25. //实现转账
  26. accountDao.addMoney(to, money);
  27. accountDao.subMoney(from, money);
  28. System.out.println("转账成功");
  29. return true;
  30. }
  31. }

1.3 dao层写入 AccountDao 接口

dao层 下写 impl 包定义 AccountDaoImpl 类 实现接口 AccountDao

  1. @Repository
  2. @RequiredArgsConstructor
  3. public class AccountDaoImpl implements AccountDao {
  4. private final JdbcTemplate jdbcTemplate;
  5. @Override
  6. public Account getAccountByAccount(String account) {
  7. String sql = "select * from account where account=?";
  8. return jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(Account.class),account);
  9. }
  10. @Override
  11. public int addMoney(String account, double money) {
  12. String sql = "update account set money=money+? where account=?";
  13. return jdbcTemplate.update(sql,money,account);
  14. }
  15. @Override
  16. public int subMoney(String account, double money) {
  17. // int i=1/0;
  18. String sql = "update account set money=money-? where account=?";
  19. return jdbcTemplate.update(sql,money,account);
  20. }
  21. }

2、事务配置类

2.1跟dao层同级创建config包,config包下创建SpringConfig类

  1. //@Configuration 该类式一个配置类,相当于一个applicationContext.xml配置文件
  2. @Configuration
  3. //@ComponentScan 表示组件扫描(会扫描basePackages包下(包含子包)所有注解)
  4. //相当于配置文件中得<context:component-scan/>
  5. @ComponentScan(basePackages = "com.cxd")
  6. //@PropertySource 表示properties配置文件得资源路径
  7. //相当于 <context:property-placeholder location="classpath*:database.properties"/>
  8. @PropertySource(value = "classpath:database.properties")
  9. //@EnableTransactionManagement 开启事务管理
  10. //相当于配置文件中得 <tx:annotation-driven/> 事务管理驱动
  11. @EnableTransactionManagement
  12. public class SpringConfig {
  13. //@Value写在属性上,表示读取配置文件中值注入到属性中
  14. @Value("${jdbc.driver}")
  15. private String driver;
  16. @Value("${jdbc.url}")
  17. private String url;
  18. @Value("${jdbc.username}")
  19. private String username;
  20. @Value("${jdbc.password}")
  21. private String password;
  22. /**
  23. * @Bean 写在配置类中得方法上 相当于配置文件中得 <bean></bean>标签
  24. * 其中得返回子就是<bean class=""></bean> class属性
  25. * bean在容器中得名字就是方法名
  26. * 数据源
  27. */
  28. @Bean
  29. public DataSource dataSource() {
  30. DriverManagerDataSource dataSource =
  31. new DriverManagerDataSource();
  32. dataSource.setDriverClassName(driver);
  33. dataSource.setUrl(url);
  34. dataSource.setUsername(username);
  35. dataSource.setPassword(password);
  36. return dataSource;
  37. }
  38. @Bean
  39. public JdbcTemplate getJdbcTemplate(DataSource dataSource) {
  40. return new JdbcTemplate(dataSource);
  41. }
  42. @Bean
  43. //事务管理器
  44. public DataSourceTransactionManager transactionManager(DataSource dataSource) {
  45. return new DataSourceTransactionManager(dataSource);
  46. }
  47. }

2.2数据库的连接

3、测试类

  1. //@ContextConfiguration(locations = "classpath:applicationContext.xml")
  2. @ContextConfiguration(classes = SpringConfig.class)
  3. @RunWith(SpringJUnit4ClassRunner.class)
  4. public class Test01 {
  5. @Autowired
  6. AccountDao accountDao;
  7. @Autowired
  8. AccountService accountService;
  9. @Test
  10. public void test02() {
  11. accountService.transfer("888888","666666",100);
  12. }
  13. }

最后测试类,查看数据库数据

4、用到的jar包

  1. @Repository
  2. @RequiredArgsConstructor
  3. public class AccountDaoImpl implements AccountDao {
  4. private final JdbcTemplate jdbcTemplate;
  5. @Override
  6. public Account getAccountByAccount(String account) {
  7. String sql = "select * from account where account=?";
  8. return jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(Account.class),account);
  9. }
  10. @Override
  11. public int addMoney(String account, double money) {
  12. String sql = "update account set money=money+? where account=?";
  13. return jdbcTemplate.update(sql,money,account);
  14. }
  15. @Override
  16. public int subMoney(String account, double money) {
  17. // int i=1/0;
  18. String sql = "update account set money=money-? where account=?";
  19. return jdbcTemplate.update(sql,money,account);
  20. }
  21. }

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号