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("过程三");
}
}