在Spring中,它拥有一个专门用来做事务处理的注解:org.springframework.jdbc.datasource.DataSourceTransactionManager
通过配置好的dataSource传给这个类,再通过注解进行需要调用方法的拦截就能够进行事务处理
演示:
spring容器:application.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
">
<!-- 直接配置一个c3p0的dataSource池 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver">
</property>
<property name="jdbcUrl"
value="jdbc:mysql:///luojuan?characterEncoding=UTF-8"></property>
<property name="user" value="root"></property>
<property name="password" value="1234"></property>
</bean>
<!-- 配置一个Spring开发的事务管理器:帮我们实现事务功能并管理con,相当于帮我们把以前做的两个事务的切面和为一个 -->
<bean id="txM"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 为了使@Transactional注解被认识,配置一个标签 -->
<tx:annotation-driven proxy-target-class="true"
transaction-manager="txM" />
<!-- 4.dao实现类的要点:
1) 必须继承"Spring提供的dao支持类: JdbcDaoSupport"
2) 要把事务管理器管理的dataSource注入到dao(注意,我们写的dao中不能声明dataSource属性。因为父类中有,而且我们本来就是注入给父类用的),以让两者使用共享的dataSource
-->
</beans>
beans.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
">
<bean id="studDao" class="cn.hncu.stud.dao.StudDaoJdbc">
<property name="dataSource" ref="dataSource"></property>
</bean>
<bean id="studDao2" class="cn.hncu.stud.dao.StudDaoJdbc2">
<property name="dataSource" ref="dataSource"></property>
</bean>
<bean id="service" class="cn.hncu.stud.service.StudServiceImpl">
<property name="dao1" ref="studDao"></property>
<property name="dao2" ref="studDao2"></property>
</bean>
</beans>
dao实现类的要点:
1) 必须继承”Spring提供的dao支持类: JdbcDaoSupport”
2) 要把事务管理器管理的dataSource注入到dao(注意,我们写的dao中不能声明dataSource属性。因为父类中有,而且我们本来就是注入给父类用的),以让两者使用共享的dataSource
package cn.hncu.stud.dao;
import java.sql.SQLException;
import javax.sql.DataSource;
import org.apache.commons.dbutils.QueryRunner;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import cn.hncu.stud.domain.User;
public class StudDaoJdbc extends JdbcDaoSupport implements IStudDAO {
@Override
public void save(User user) throws SQLException {
String sql = "insert into user2(id,name) values('"+
user.getId()+"','"+user.getName()+"')";
getJdbcTemplate().execute(sql);
}
}
service实现类:
package cn.hncu.stud.service;
import java.sql.SQLException;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import cn.hncu.stud.dao.IStudDAO;
import cn.hncu.stud.domain.User;
public class StudServiceImpl implements IStudService {
// 注入
private IStudDAO dao1 = null;
private IStudDAO dao2 = null;
public IStudDAO getDao1() {
return dao1;
}
public void setDao1(IStudDAO dao1) {
this.dao1 = dao1;
}
public IStudDAO getDao2() {
return dao2;
}
public void setDao2(IStudDAO dao2) {
this.dao2 = dao2;
}
@Override//使用注解
@Transactional(propagation = Propagation.REQUIRED)
public void save(User user) throws SQLException {
dao1.save(user);
dao2.save(user);
}
}
在servlet中获取到的异常时事务已经处理完成,只要抛出异常信息即可:
package cn.hncu.stud.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.SQLException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import cn.hncu.stud.domain.User;
import cn.hncu.stud.service.IStudService;
public class StudServlet extends HttpServlet {
private IStudService service = null;
@Override
public void init() throws ServletException {
// 获取web项目中的spring容器
ApplicationContext ctx = WebApplicationContextUtils
.getWebApplicationContext(getServletContext());
service = ctx.getBean("service", IStudService.class);
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
User user = new User();
user.setId("U001");
user.setName("Jack");
try {
service.save(user);
} catch (Exception e) {
System.out.println("事务出异常....");
// e.printStackTrace();
}
}
}