使用注解完成spring的事务管理功能
1、配置数据源、JdbcTemplate操作数据
//配置数据源 @Bean public DataSource dataSource() throws PropertyVetoException { ComboPooledDataSource dataSource = new ComboPooledDataSource(); dataSource.setUser(user); dataSource.setPassword(password); dataSource.setDriverClass(driver); dataSource.setJdbcUrl(url); return dataSource; } //配置JdbcTemplate @Bean public JdbcTemplate jdbcTemplate(/*从ioc容器中获取dataSource对象*/DataSource dataSource){ JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); return jdbcTemplate; }
2、编写servlce将需要进行事务控制的方法上加上@Transactional注解
@Service public class UserService { @Autowired UserDao userDao; @Transactional//表示当前方法是一个事务方法 public void insert(){ String username = UUID.randomUUID().toString().substring(1, 5); userDao.insert(username,18); System.out.println("插入完成"); //出现异常,测试事务是否开启成功 int i = 1/0; } }
3、给配置类加上@EnableTransactionManagement注解,开启基于注解的事务管理功能
@EnableTransactionManagement//开启基于注解的事务管理功能 @PropertySource("classpath:dbconfig/db.properties") @ComponentScan(value = {"com.it.tx"}) @Configuration public class TxConfig {
4、配置事务管理器来控制事务
//注册事务管理器 @Bean public DataSourceTransactionManager dataSourceTransactionManager(DataSource dataSource){ DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(dataSource); return transactionManager; }
5、测试
1.添加方法执行之前数据库数据
2.注释掉i=1/0,未出现错误时,添加成功
3.打开异常,再次运行
有数学异常,查看数据库
数据回滚,事务控制成功
源码:
配置类:
@EnableTransactionManagement//开启基于注解的事务管理功能 @PropertySource("classpath:dbconfig/db.properties") @ComponentScan(value = {"com.it.tx"}) @Configuration public class TxConfig { @Value("${jdbc.user}") private String user; @Value("${jdbc.password}") private String password; @Value("${jdbc.driver}") private String driver; @Value("${jdbc.url}") private String url; //配置数据源 @Bean public DataSource dataSource() throws PropertyVetoException { ComboPooledDataSource dataSource = new ComboPooledDataSource(); dataSource.setUser(user); dataSource.setPassword(password); dataSource.setDriverClass(driver); dataSource.setJdbcUrl(url); return dataSource; } //配置JdbcTemplate @Bean public JdbcTemplate jdbcTemplate(/*从ioc容器中获取dataSource对象*/DataSource dataSource){ JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); return jdbcTemplate; } //注册事务管理器 @Bean public DataSourceTransactionManager dataSourceTransactionManager(DataSource dataSource){ DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(dataSource); return transactionManager; } }
Service类:
@Service public class UserService { @Autowired UserDao userDao; @Transactional//表示当前方法是一个事务方法 public void insert(){ String username = UUID.randomUUID().toString().substring(1, 5); userDao.insert(username,18); System.out.println("插入完成"); //出现异常,测试事务是否开启成功 int i = 1/0; } }
Dao:
@Repository public class UserDao { @Autowired JdbcTemplate jdbcTemplate; public void insert(String username, int age){ String sql = "insert into tbl_user(username,age) values(?,?)"; jdbcTemplate.update(sql,username,age); } }