Spring学习笔记【part11】TX注解开发

Spring 学习笔记 Part11

1. 开启spring对注解事务的支持

xml方法开启方式

<tx:annotation-driven transaction-manager="transactionManager"/>

纯注解方式开启方式 @EnableTransactionManagement

@Configuration
@EnableTransactionManagement
public class SpringConfiguration {
       
}

2. 注解事务的新标签

@EnableTransactionManagement:开启注解开发方式管理事务

@Transactional:声明式事务管理,可以贴在类上或贴在单独的方法上,被贴的类方法或者单独方法将能会被spring事务管理器管理事务

属性:(跟xml配置一样,在上节part10详细介绍过)

在这里插入图片描述

3. 完整回顾注解开发

3.1 config包

SpringConfiguration.java

@Configuration
@ComponentScan("com.swz")
@Import({JdbcConfig.class,TransactionConfig.class})
@PropertySource("classpath:jdbcConfig.properties")
@EnableTransactionManagement
public class SpringConfiguration {
    
}

JdbcConfig.java

public class JdbcConfig {

    @Value("${jdbc.driver}")
    private String driver;

    @Value("${jdbc.url}")
    private String url;

    @Value("${jdbc.username}")
    private String username;

    @Value("${jdbc.password}")
    private String password;

    @Bean("template")
    public JdbcTemplate createJdbcTemplate(DataSource ds){
        return new JdbcTemplate(ds);
    }

    @Bean("ds")
    public DataSource getDataSource(){
        DriverManagerDataSource ds = new DriverManagerDataSource();
        ds.setDriverClassName(driver);
        ds.setUrl(url);
        ds.setUsername(username);
        ds.setPassword(password);
        return ds;
    }

}

TransactionConfig.java

public class TransactionConfig {

    // PlatformTransactionManager是接口,DataSourceTransactionManager是实现类

    @Bean("txManager")
    public PlatformTransactionManager getDataSourceTransactionManager(DataSource ds){
        return new DataSourceTransactionManager(ds);
    }

}

3.2 Service包

accountServiceImpl.java

@Service("accountService")
public class AccountServiceImpl implements AccountService {

    @Autowired
    private AccountDao dao;

    @Transactional(propagation = Propagation.REQUIRED,readOnly = false)
    @Override
    public Account findAccountById(Integer accountId) {
        return dao.findAccountById(accountId);
    }

    @Transactional(propagation = Propagation.SUPPORTS,readOnly = true)
    @Override
    public void transfer(String sourceName, String targetName, Float money) {
        Account source = dao.findAccountByName(sourceName);
        Account target = dao.findAccountByName(targetName);
        source.setMoney(source.getMoney()-money);
        target.setMoney(target.getMoney()+money);
        int i=1/0;
        dao.updateAccount(source);
        dao.updateAccount(target);
    }
}

3.3 Dao包

AccountDaoImpl.java

@Repository("accountDao")
public class AccountDaoImpl implements AccountDao {

    @Autowired
    private JdbcTemplate template;

    @Override
    public Account findAccountById(Integer accountId) {
        return template.queryForObject("select * from account where id = ?",new BeanPropertyRowMapper<Account>(Account.class),accountId);
    }

    @Override
    public Account findAccountByName(String accountName) {
        List<Account> accounts = template.query("select * from account where name = ?", new BeanPropertyRowMapper<Account>(Account.class), accountName);
        if(accounts.isEmpty()){
            return null;
        }
        if(accounts.size()>1){
            throw new RuntimeException();
        }
        return accounts.get(0);
    }

    @Override
    public void updateAccount(Account account) {
        template.update("update account set name=?,money=? where id=?",account.getName(),account.getMoney(),account.getId());
    }
}

3.4 其他

jdbcConfig.properties

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/spring_db?useSSL=false&serverTimezone=Hongkong&characterEncoding=utf-8
jdbc.username=root
jdbc.password=123456

Test.java

public class AccountServiceTest {
    public static void main(String[] args) {

        ApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfiguration.class);
        AccountService service = ac.getBean("accountService", AccountService.class);
        service.transfer("aaa","bbb",100f);

    }
}

到此,spring基础知识的学习先告一段落。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Parker7

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值