Spring框架--事务处理(Spring Transaction)

Spring的事务处理的原理还是AOP的原理和标注来实现了声明式的事务处理。
如何编码
a:引入jar(不用引,因为它就是aop的实现,默认引入)
b:开启Spring的事务处理功能
Jdbc配置类上加标注 @EnableTransactionManagement 开启事务处理功能
c:配置事务管理器Bean
JdbcConfig类配置中加入事务管理器(TransactionManagement)
d:开始使用Spring声明式的事务

导入jar

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.uek.objuct</groupId>
  <artifactId>spring-app</artifactId>
  <version>0.1</version>
  <packaging>war</packaging>
<properties>
  <project.bulid.sourceEncoding>UTF-8</project.bulid.sourceEncoding>
  <failOnMissingWebXml>false</failOnMissingWebXml>
  <!-- 自定义版本标记  -->
  <spring.version>5.1.7.RELEASE</spring.version>
  </properties>
  <!-- 配置项目所需要的第三方的jar包 -->
   <dependencies>
       <!--Servlet api  -->
    <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
    </dependency>
      <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>  
    </dependency> 

<!-- https://mvnrepository.com/artifact/junit/junit  Junit单元测试-->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>${spring.version}</version>
    <scope>test</scope>
</dependency>
<!--Spring  框架 IOC 第一天要引入的  --> 
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>${spring.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>${spring.version}</version>
</dependency>
<!-- Spring5 AOP -->
<dependency>
   <groupId>org.aspectj</groupId>
    <artifactId>aspectjrt</artifactId>
    <version>1.8.10</version>    
</dependency>
<dependency>
   <groupId>aopalliance</groupId>
    <artifactId>aopalliance</artifactId>
    <version>1.0</version>    
</dependency>
<dependency>
   <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.8.10</version>        
</dependency>
<dependency>
   <groupId>org.springframework</groupId>
    <artifactId>spring-aop</artifactId>
    <version>${spring.version}</version>        
</dependency>

    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java   Mysql数据库驱动  -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.48</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/druid    Druid数据库连接池-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.20</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>${spring.version}</version>
</dependency>
<!-- Spring与Spring MVC 的整合 -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>${spring.version}</version>
</dependency>

<!--阿里的fastJSON处理工具  -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.62</version>
</dependency> 

   </dependencies>
   
   
   <!-- 4.配置构建插件 -->
   <build>
      <plugins>
        <!-- 编译插件 -->
        <plugin>
         <artifactId>maven-compiler-plugin</artifactId>
        <version>3.5.1</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
        </plugin>
        <!-- Tomcat插件 -->
        <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <version>2.2</version>
        <configuration>
          <port>8080</port>
          <path>/uservlet</path>   
          <!-- 实现热部署   不需要每次修改代码后都重启启动Tomcat -->
        </configuration>
      </plugin>
      
      </plugins>
   
   </build>
   
</project>

数据库表
数据库表

实体类

public class Account implements Serializable{
	public static final long serialVersionUID = 1L;
	private int id;
	private String name;
	private double balance;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public double getBalance() {
		return balance;
	}
	public void setBalance(double balance) {
		this.balance = balance;
	}
	
	public Account(){}
	public Account(int id, String name, double balance) {
		super();
		this.id = id;
		this.name = name;
		this.balance = balance;
	}
	
	public Account(String name, double balance) {
		super();
		this.name = name;
		this.balance = balance;
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		long temp;
		temp = Double.doubleToLongBits(balance);
		result = prime * result + (int) (temp ^ (temp >>> 32));
		result = prime * result + id;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Account other = (Account) obj;
		if (Double.doubleToLongBits(balance) != Double.doubleToLongBits(other.balance))
			return false;
		if (id != other.id)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
	@Override
	public String toString() {
		return "Account [id=" + id + ", name=" + name + ", balance=" + balance + "]";
	}
}

jdbc.properties

jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/db_chat?characterEncoding=utf8
jdbc.username=root
jdbc.password=

实现类

@Repository("accountDaoJdbcImpl")    //做存储服务的Bean
public class AccountDaoJdbcImpl implements IAccountDao{
	@Autowired
	private DataSource ds;
	
	@Autowired
	private JdbcTemplate jdbcTemplate;
	
	//查找数据
	@Override
	public List<Account> findAll() {
		try {
			Connection con =ds.getConnection();
			String sql = "select * from account";
			Statement stmt =  con.createStatement();
			ResultSet rs = stmt.executeQuery(sql);
			List<Account> acts = new ArrayList<>();
			while(rs.next()){
				Account act = new Account();
				act.setId(rs.getInt(1));
				act.setName(rs.getString(2));
				act.setBalance(rs.getDouble(3));
				acts.add(act);
			}
			return acts;
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	//增加和更新数据
	@Override
	public void saveOrUpdate(Account act) {
		if(act.getId()==0) {
			jdbcTemplate.update(
					"insert into account(name,balance) values(?,?)",
					new Object[] {act.getName(),act.getBalance()}
					);
		}else {
			jdbcTemplate.update(
					"update account set name=?,balance=? where id=?",
					new Object[] {act.getName(),act.getBalance(),act.getId()}
					);
		}
		
	}
	
	//删除数据
	@Override
	public void delete(Account act) {
			jdbcTemplate.update(
					"delete from account where id=?",
					new Object[] {act.getId()}
					);
		
	}

}

业务实现类

@Service("accountServiceDaoImpl")
public class AccountServiceDaoImpl implements IAccountService{
	
	@Autowired
	private IAccountDao actDao;

	@Override
	@Transactional
	public void tranfer() {   //模拟里边有很多数据类
		actDao.saveOrUpdate(new Account("张三丰",1.0));
		int i =  3;
		//if(i == 3) throw new RuntimeException("条件满足,所以报异常");
		actDao.saveOrUpdate(new Account("yyy",1.0));
	}

}

引用的配置

@Configuration
@Import({JdbcConfig.class})
@ComponentScan("包名")
public class AppConfig {

}

AccountDao接口

public interface IAccountDao {
	
	//查找数据
	List<Account> findAll();
	
	//实现数据库的增改
	void saveOrUpdate(Account act);             //act.getID
	
	//实现数据的删除
	void delete(Account act);
	
}

验证

public interface IAccountService {
	void tranfer();      //模拟转账
}

Jdbc的配置类

@Configuration
@PropertySource("classpath:jdbc.properties")    //你的jdbc配置信息的位置
public class JdbcConfig {
	//1.获取配置信息
	@Value("${jdbc.driverClass}")
	private String driver;
	@Value("${jdbc.url}")
	private String url;
	@Value("${jdbc.username}")
	private String username;
	@Value("${jdbc.password}")
	private String password;
	@Value("${pool.maxActive}")
	private int maxActive;
	
	//--2.要有数据库连接池对象
	@Bean(name="dataSource")
	public DataSource createDataSource(){
		DruidDataSource ds = new DruidDataSource();
		ds.setDriverClassName(driver);
		ds.setUrl(url);
		ds.setUsername(username);
		ds.setPassword(password);
		ds.setMaxActive(maxActive);   //设置最大连接数
		return ds;
	}
	//3.配置JDBCTemplate
	@Bean(name="jdbcTemplate")
	public JdbcTemplate createJdbcTemplate(DataSource ds){
		return new JdbcTemplate(ds); //利用数据源构造jdbcTemplate
	} 
	
	//-- 4. 配置事务管理器
	@Bean(name="transactionManager")
	public PlatformTransactionManager createTransactionManager(DataSource ds) {
		
		return new DataSourceTransactionManager(ds);
	}

	
}

AccountDao测试 测试

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes={AppConfig.class})
public class TestAccountService {
	@Autowired
	@Qualifier("accountServiceDaoImpl")  
	private IAccountService actService;
	
	@Test
	public void testTransaction(){
		actService.tranfer();
	}
}
发布了26 篇原创文章 · 获赞 9 · 访问量 282

猜你喜欢

转载自blog.csdn.net/weixin_45430616/article/details/103006150