JAVAEE之Spring学习(四)---通过spring注解进行事务处理

在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();
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值