Spring框架之@Transactional注解用法(一)

一、用法简介

@Transactional注解是spring的核心思想AOP(面向切面编程)的体现。它可以结合事务管理器类帮助我们更好地管理事务。以spring和mybatis的整合为例

二、环境配置

1、maven项目的目录结构

 

2、pom.xml

(只列出部分配置)

 <!-- spring jar -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>3.2.18.RELEASE</version>
    </dependency>
    <!-- mybatis  jar -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.5</version>
    </dependency>
    
    <!-- spring和myabtis整合的jar -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
        <version>1.3.0</version>
    </dependency>
    
    <!-- 
        ... 省略部分配置
    -->

 

3、spring-myabtis.xml 配置文件

     (以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:p="http://www.springframework.org/schema/p"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-3.2.xsd ">
    
    
    <!-- 1、导入jdbc配置文件 -->
    <context:property-placeholder location="classpath:jdbc-mysql.properties"/>
    <!-- 2、配置myabtis连接池 -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
       <!-- 配置连接数据库服务器的url -->
       <property name="driverClassName" value="${jdbc.driverclass}"/>
       <!-- 配置用户名 -->
       <property name="url" value="${jdbc.url}"/>
       <!-- 配置用户名 -->
       <property name="username" value="${jdbc.user}"/>
       <!--  配置密码 -->
       <property name="password" value="${jdbc.password}"/>  
    </bean>
    <!-- 3、配置SqlSessionFactoryBean: 负责创建SQLSession对象 -->
    <bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 配置引用的连接池组件 -->
        <property name="dataSource" ref="dataSource"></property>
        <!-- 引用myabtis的配置文件中的配置 -->
        <property name="configLocation" value="classpath:mybatis-config.xml"></property>
        <!-- 配置xml格式map的映射信息 -->
    </bean>
    <!-- 4、配置SQLSessionTemplate:负责管理SQLSession,完成SQL语句的映射 -->
     <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate" scope="prototype">
         <!-- 配置SQLSessionFactory -->
         <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactoryBean"/>
     </bean>
     <!-- 5、统一配置mapper接口所在位置 -->
    <bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="cn.wang.mapper"></property>
    </bean>
    
    <!-- 6、将service类交给spring管理  -->
    <context:component-scan base-package="cn.wang.service" />
    
    <!-- 7、spring声明式事务配置     -->
    <!-- 7-1 配置事务管理器类 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
    <!-- 7-2 启动@Transactional注解 -->
    <tx:annotation-driven />
    
    
</beans>

 

4、业务逻辑层

@Service
public class UserServiceImpl implements UserService{
    
    // 加载mapper
    @Autowired
    private UserMapper usermapper;

    @Transactional // 启用事务管理
    public void myTransaction(User addUser, User updateuser) {
        System.out.println("---- UserServiceImpl  myTransaction方法开始 ");
        usermapper.add(addUser);
        
                int i = 1/0;

        usermapper.update(updateuser);
        
        System.out.println("---- UserServiceImpl  myTransaction方法结束 ");
    }

}

 

5、junit测试事务注解@Transactional

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:spring-mybatis.xml")
public class TestTransactionAnnotation {
     
    @Autowired
    private UserService userService;
    
    @Test
    public void test1(){
        User addUser = new User("dzq","邓紫棋","123456789",1,new Date(),"13688889999","西安市长安区成府路207号",1,1,new Date(),null,null);
        
        User updateuser = new User();
        updateuser.setId(85);
        updateuser.setUserCode("zzy");
        updateuser.setUserName("张震岳");
        
        userService.myTransaction(addUser, updateuser);
    }
    /**
     * spring  默认 会提交事务
     */

}

 

总结

     1)@Transactional注解可以添加在类上或者业务方法上。

     添加在类上表示类中的每个业务方法都使用spring的声明式事务管理

     添加在方法上表示该业务方法使用spring的声明式事务管理

    2) @Transactional注解可以添加在类上,也可以添加在方法上

    3) 如果同一个事务中,程序不出现异常,事务提交。

        如果同一个事务中,某一处出现异常,事务回滚。

 

这就是@Transactional注解最基本的用法。

 

 

此文希望可以帮助到大家。如有错误,请指教。                                                           

如果大家还有其他的情况或者好的解决方法,也望指教,感谢阅读。

posted @ 2019-07-26 17:46  小雨叚、  阅读(713)  评论(0编辑  收藏  举报