zoukankan      html  css  js  c++  java
  • Spring声明式事务

    先把所有代码都放上来:

    1,实体类:User.java

     1 package com.maolei.pojo;
     2 
     3 import lombok.AllArgsConstructor;
     4 import lombok.Data;
     5 import lombok.NoArgsConstructor;
     6 
     7 //使用lombok
     8 @Data
     9 @AllArgsConstructor
    10 @NoArgsConstructor
    11 public class User {
    12     private int id;
    13     private String name;
    14     private String pwd;
    15 
    16 }

    2:接口:UserMapper.java

     1 package com.maolei.mapper;
     2 
     3 import java.util.List;
     4 
     5 import com.maolei.pojo.User;
     6 
     7 public interface UserMapper {
     8     public List<User> selectUser();
     9     public int addUser(User user);
    10     public int deleteUser(int id);
    11 
    12 }

    3:接口实现类:UserMapperImpl.java

     1 package com.maolei.mapper;
     2 
     3 import java.util.List;
     4 
     5 import org.mybatis.spring.support.SqlSessionDaoSupport;
     6 
     7 import com.maolei.pojo.User;
     8 
     9 public class UserMapperImpl extends SqlSessionDaoSupport implements UserMapper{
    10 
    11     public int addUser(User user) {
    12         return getSqlSession().getMapper(UserMapper.class).addUser(user);
    13     }
    14 
    15     public int deleteUser(int id) {
    16         return getSqlSession().getMapper(UserMapper.class).deleteUser(id);
    17     }
    18 
    19     public List<User> selectUser() {
    20         User user = new User(5,"王力宏","857857");
    21         addUser(user);
    22         deleteUser(1);
    23         return getSqlSession().getMapper(UserMapper.class).selectUser();
    24     }
    25 
    26 }

    4:接口的映射文件:UserMapper.xml

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     3         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
     4 <mapper namespace="com.maolei.mapper.UserMapper">
     5     <select id="selectUser" resultType="user">
     6         select * from user;
     7     </select>
     8     <insert id="addUser" parameterType="user">
     9         insert into user(id,name,pwd) value(#{id},#{name},#{pwd})
    10     </insert>
    11     <delete id="deleteUser" parameterType="int">
    12         deletes from user where id =#{id}
    13     </delete>
    14 </mapper>

    注意这里故意把delete写成deletes,让sql执行出错

    5:mybatis-config.xml

    1 <?xml version="1.0" encoding="UTF-8"?>
    2 <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    3         "http://mybatis.org/dtd/mybatis-3-config.dtd">
    4 <configuration>
    5     <typeAliases>
    6         <!-- <typeAlias alias="User" type="com.maolei.pojo.User"/> -->
    7         <package name="com.maolei.pojo"/>
    8     </typeAliases>
    9 </configuration>

    6:spring-dao.xml

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4     xmlns:aop="http://www.springframework.org/schema/aop"
     5     xmlns:tx="http://www.springframework.org/schema/tx"
     6     xsi:schemaLocation="http://www.springframework.org/schema/beans
     7         https://www.springframework.org/schema/beans/spring-beans.xsd
     8         http://www.springframework.org/schema/aop
     9         https://www.springframework.org/schema/aop/spring-aop.xsd
    10         http://www.springframework.org/schema/tx
    11         https://www.springframework.org/schema/tx/spring-tx.xsd">
    12     
    13     <!-- dataSource:使用Spring的数据源替换Mybatis的配置 c3p0 dbcp druid 
    14     我们这里使用的Spring提供的JDBC:org.springframework.jdbc.datesource -->
    15     <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    16         <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    17         <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&amp;characterEncoding=UTF-8&amp;useSSL=false&amp;serverTimezone=GMT"/>
    18         <property name="username" value="root"/>
    19         <property name="password" value="123456"/>
    20     </bean>
    21     <!-- sqlsessionFactory -->
    22     <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    23           <property name="dataSource" ref="dataSource" />
    24           <!-- 绑定Mybatis配置文件 -->
    25           <property name="configLocation" value="classpath:mybatis-config.xml"/>
    26           <property name="mapperLocations" value="classpath:com/maolei/mapper/*.xml"/>
    27     </bean>
    28     <!-- sqlsessionTemplate:就是我们使用的sqlsession-->
    29     <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
    30         <constructor-arg index="0" ref="sqlSessionFactory"/>
    31     </bean>
    32     
    33     <!-- 配置声明式事务 -->
    34     <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    35           <constructor-arg ref="dataSource" />
    36     </bean>
    37     <!-- 结合AOP实现事务的织入 -->
    38     <!-- 配置事务通知 -->
    39     <tx:advice id="txAdvice" transaction-manager="transactionManager">
    40         <!-- 给哪些方法配置事务 -->
    41         <!-- 配置事务的传播特性:new propagation -->
    42         <tx:attributes>
    43             <tx:method name="addUser" propagation="REQUIRED"/>
    44             <tx:method name="delete*" propagation="REQUIRED"/>
    45             <tx:method name="*" propagation="REQUIRED"/>
    46         </tx:attributes>
    47     </tx:advice>
    48     <!-- 配置事务切入 -->
    49     <aop:config>
    50         <aop:pointcut expression="execution(* com.maolei.mapper.*.*(..))" id="txPointCut"/>
    51         <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"/>
    52     </aop:config>
    53 
    54 
    55 </beans>

    这个xml里加粗的部分们就是spring声明式事务的体现。

    这里注意下Spring中propagation的7种事务配置

    • Spring中七种Propagation类的事务属性详解:

    REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。

    SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。

    MANDATORY:支持当前事务,如果当前没有事务,就抛出异常。

    REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。

    NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

    NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。

    NESTED:支持当前事务,如果当前事务存在,则执行一个嵌套事务,如果当前没有事务,就新建一个事务。

    另外,<tx:method name="..."/>里的name定义是根据正则表达式匹配接口中的方法名,上面的xml中的三种name定义,分别能匹配到addUser,deleteUser,所有方法。

    7.applicationContext.xml

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4     xmlns:aop="http://www.springframework.org/schema/aop"
     5     xsi:schemaLocation="http://www.springframework.org/schema/beans
     6         https://www.springframework.org/schema/beans/spring-beans.xsd
     7         http://www.springframework.org/schema/aop
     8         https://www.springframework.org/schema/aop/spring-aop.xsd">
     9     
    10     <import resource="spring-dao.xml"/>
    11     
    12     <bean id="userMapper" class="com.maolei.mapper.UserMapperImpl">
    13         <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
    14     </bean>
    15 
    16 
    17 </beans>

    8:测试类:MyTest.java

     1 import java.io.IOException;
     2 import java.io.InputStream;
     3 import java.util.List;
     4 
     5 import org.apache.ibatis.io.Resources;
     6 import org.apache.ibatis.session.SqlSession;
     7 import org.apache.ibatis.session.SqlSessionFactory;
     8 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
     9 import org.junit.Test;
    10 import org.mybatis.spring.SqlSessionTemplate;
    11 import org.springframework.context.ApplicationContext;
    12 import org.springframework.context.support.ClassPathXmlApplicationContext;
    13 
    14 import com.maolei.mapper.UserMapper;
    15 import com.maolei.pojo.User;
    16 
    17 public class MyTest {
    18     @Test
    19     public void getUser() throws IOException {
    20         ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    21         UserMapper userMapper = context.getBean("userMapper",UserMapper.class);
    22         List<User> userList = userMapper.getUser();
    23         for (User user : userList) {
    24             System.out.println(user);
    25         }
    26     }
    27 
    28 }

    测试结果:

    ### Error updating database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'deletes from user where id =1' at line 1

    先执行的addUser方法插入的数据也没有提交在数据库中

    
    
  • 相关阅读:
    [APIO2018]Circle selection
    [CF1025D]Recovering BST
    [CF1023D]Array Restoration
    [POI2006]PRO-Professor Szu
    [CF888G]Xor-MST
    可持久化并查集小结
    [国家队集训]最短路
    [POI2012]FES-Festival
    [SDOI2010]所驼门王的宝藏
    洛谷 P1025 & [NOIP2001提高组] 数的划分(搜索剪枝)
  • 原文地址:https://www.cnblogs.com/maol986162214/p/15715659.html
Copyright © 2011-2022 走看看