使用注解完成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);
}
}