spring 控制事物

1.通过在编码中控制事物

  springContext.xml:

 ...

  <bean id="teamDaoImpl" class="com.dao.ObjDaoImpl">
  <property name="jdbcTemplate" ref="jdbcTemplate"></property>
  <property name="transactionTemplate">
   <bean class="org.springframework.transaction.support.TransactionTemplate">
    <property name="transactionManager" ref="transactionManager"></property>
   </bean>
  </property>
 </bean>
 
 
 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <property name="dataSource">
            <ref bean="dataSource"/>
        </property>
 </bean>

<bean id="dataSource"
  class="org.apache.commons.dbcp.BasicDataSource">
  <property name="driverClassName"
   value="com.mysql.jdbc.Driver">
  </property>
  <property name="url" value="jdbc:mysql://127.0.0.1:3306/mydb"></property>
  <property name="username" value="root"></property>
  <property name="password" value="root"></property>
 </bean>

...

首先要配置一个事物管理器transactionManager,该事物管理器要配置是一个相应的数据源datasource。然后在teamDaoImpl中配置一个属性transactionManager。

 

JAVA代码:

package com.dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.TransactionCallback;
import org.springframework.transaction.support.TransactionTemplate;

import com.vo.Team;

public class ObjDaoImpl implements ObjDao {

 private JdbcTemplate jdbcTemplate;
 
 private TransactionTemplate transactionTemplate;
 
 public TransactionTemplate getTransactionTemplate() {
  return transactionTemplate;
 }
 public void setTransactionTemplate(TransactionTemplate transactionTemplate) {
  this.transactionTemplate = transactionTemplate;
 }
 public JdbcTemplate getJdbcTemplate() {
  return jdbcTemplate;
 }
 public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
  this.jdbcTemplate = jdbcTemplate;
 }
 public void getMoney() {
  this.transactionTemplate.execute(
    new TransactionCallback(){
     public Object doInTransaction(TransactionStatus ts){
      try {
       System.out.println("过程一");
       System.out.println("过程二");
       System.out.println("过程三");
      } catch (Exception e) {
       ts.setRollbackOnly();
      }
      return null;
     }
    }
  );
  
 }
}

注释:添加事物的一种方法是利用spring的TransactionTemplate类,该类有一种回调机制,要想使用该类,必须从实现TransactionCallBack接口开始,由于该接口只有一个方法需要实现,因此可以把他作为一个匿名内部类来实现,将所需要作为实物来处理的代码,把他们放入 doInTransaction()即可。

调用TransactionTemplate的execute()方法,即执行包含在TransactionCallback事例里的代码。如果代码遇到了问题,则调用TransactionStatus对象的setRollbackOnly()方法来回滚整个事物。

在实现类中的TransactionTemplate是在配置文件中配置org.springframework.transaction.support.TransactionTemplate来实现的。

2.通过在applicationContext.xml中配置事物

 

...

<bean id="teamDaoImpl" class="com.dao.ObjDaoImpl">
  <property name="jdbcTemplate" ref="jdbcTemplate"></property>
  <property name="transactionTemplate">
   <bean class="org.springframework.transaction.support.TransactionTemplate">
    <property name="transactionManager" ref="transactionManager"></property>
   </bean>
  </property>
 </bean>


 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <property name="dataSource">
            <ref bean="dataSource"/>
        </property>
 </bean>
 
 <bean id="teamProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
  <property name="target" ref="teamDaoImpl"></property>
  <property name="proxyInterfaces" value="com.dao.ObjDao"></property>
  <property name="transactionManager" ref="transactionManager"></property>
  <property name="transactionAttributes">
   <props>
    <prop key="add*">PROPAGATION_REQUIRED</prop>
   </props>
  </property>
 </bean>

...

该配置文件定义了三个部分:

1.target:表示具体要代理的对象。

2.proxyInterfaces:表示代理对象所实现的接口

3.transactionManager:表示定义的事物管理器

<prop key="add*">PROPAGATION_REQUIRED</prop>
表示对teamDaoImpl中的ADD开头的方法添加事物。

SPRING定义了7种不同的传播行为。具体可以GOOGLE查下。

 

JAVA代码:

package com.dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.TransactionCallback;
import org.springframework.transaction.support.TransactionTemplate;

import com.vo.Team;

public class ObjDaoImpl implements ObjDao {

 private JdbcTemplate jdbcTemplate;
 
 private TransactionTemplate transactionTemplate;
 
 public TransactionTemplate getTransactionTemplate() {
  return transactionTemplate;
 }
 public void setTransactionTemplate(TransactionTemplate transactionTemplate) {
  this.transactionTemplate = transactionTemplate;
 }
 public JdbcTemplate getJdbcTemplate() {
  return jdbcTemplate;
 }
 public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
  this.jdbcTemplate = jdbcTemplate;
 }
 public void save(Team team) {
  String sql = "insert into team (Name) values(?)";
  
  this.jdbcTemplate.update(sql,new Object[]{team.getName()});

 }
 public Team getTeamById(int id) {
  // TODO Auto-generated method stub
  String sql = "select id,name from team where id=?";
  List teams = this.jdbcTemplate.query(sql,new Object[]{Integer.valueOf(id)},new RowMapper(){
   public Object mapRow(ResultSet rs,int rowNum) throws SQLException,DataAccessException{
    Team team = new Team();
    team.setId(rs.getInt("id"));
    team.setName(rs.getString("name"));
    return team;
    
   }
  });
  return teams.size()>0?(Team)teams.get(0):null;
 }
 public void getMoney() {
  this.transactionTemplate.execute(
    new TransactionCallback(){
     public Object doInTransaction(TransactionStatus ts){
      try {
       System.out.println("过程一");
       System.out.println("过程二");
       System.out.println("过程三");
      } catch (Exception e) {
       ts.setRollbackOnly();
      }
      return null;
     }
    }
  );
  
 }
//通过在配置文件定义后,只对该方法添加了事物。

 public void addMoneyXml() {
  System.out.println("过程一");
  System.out.println("过程二");
  System.out.println("过程三");


 }

}

你可能感兴趣的:(DAO,spring,sql,bean,jdbc)