创建数据表
目录结构
配置类
package com.sun.Spring.Dao.config;
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.sql.DataSource;
@Configuration //配置类
//组件扫描
@ComponentScan(basePackages ="com.sun.Spring.Dao")
//开启事务
@EnableTransactionManagement
public class TxConfig {
// 创建数据库连接池
@Bean
public DruidDataSource getDruidDataSource(){
DruidDataSource dataSource=new DruidDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql:///数据库名");
dataSource.setUsername("用户名");
dataSource.setPassword("密码");
return dataSource; //返回值是DruidDataSource类型的
}
// 创建JDBCTemplate对象
@Bean
public JdbcTemplate getJdbcTemplate(DataSource dataSource){
// 到ioc容器中根据类型找到dataSource对象进行注入
JdbcTemplate jdbcTemplate=new JdbcTemplate();
jdbcTemplate.setDataSource(dataSource);
return jdbcTemplate;
}
// 配置事务管理器
@Bean
public DataSourceTransactionManager getdataSourceTransactionManager(DataSource dataSource){
DataSourceTransactionManager TransactionManager=new DataSourceTransactionManager();
TransactionManager.setDataSource(dataSource);
return TransactionManager;
}
}
UserDaoImpl.java 实现类
package com.sun.Spring.Dao.Dao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
@Repository
public class UserDaoImpl implements UserDao {
// 注入JDBCTemplate模板 模板已在配置文件中配置完成
@Autowired
private JdbcTemplate jdbcTemplate;
@Override
public void addMoney() {
String sql="update t_account set money=money+? where username=?";
int marry = jdbcTemplate.update(sql, 100, "mary");
System.out.println(marry);
}
@Override
public void reduceMoney() {
String sql="update t_account set money=money-? where username=?";
int lucy = jdbcTemplate.update(sql, 100, "lucy");
System.out.println(lucy);
}
}
UserService.java 实现转账
package com.sun.Spring.Dao.Service;
import com.sun.Spring.Dao.Dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
@Service
public class UserService {
// 注入Dao
@Autowired
private UserDao userDao;
// 传播行为,隔离级别
@Transactional(timeout = -1,readonly = false ,propagation=Propagation.REQUIRED,isolation = Isolation.REPEATABLE_READ)
public void setMoney(){
// lucy少100
userDao.reduceMoney();
int a=100/0;
// mary多一百
userDao.addMoney();
}
}
注:第一步,开启事务。第二步,进行事务操作。第三步,如果没有发生异常,提交事务;如果发生异常,事务回滚。(数据表数据不会发生变化)-----事务包含的所有操作要么全部成功,要么全部失败回滚。
测试方法
// 完全注解开发
@Test
public void test2(){
ApplicationContext context=
new AnnotationConfigApplicationContext(TxConfig.class);
UserService userService = context.getBean("userService", UserService.class);
userService.setMoney();
}
}



