spring学习17:声明式事务

spring学习17:声明式事务

  • 回顾事务:

    • 要么都成功,要么都失败;

    • 事务在项目开发中十分重要,涉及到数据的一致性问题!

       

 

  • 事务的ACID原则:

    • 原子性;

    • 一致性;

    • 隔离性:多个业务可能操作同一个资源,是互相隔离的,防止数据损坏;

    • 持久性:事务一旦被提交,无论系统发生什么问题,结果都不会被影响;

 

  • Spring整合Mybatis:模拟事务市场场景

    • 编写pojo实体类

    • 编写mapper接口

    • 编写mapper.xml配置文件

    • 编写mapper接口的实现类(为了整合Spring,创建SQLSession)

    • 编写mybatis-config.xml配置文件

    • 编写spring-dao.xml(Spring整合Mybatis,注册数据源,SqlSessionFactory,SqlSessionTemplate)

    • 编写applicationContext.xml(导入spring-dao.xml, 注册bean)

    • 测试

 

 

  • Spring中的事务管理:

    • 声明式事务:AOP【推荐】

    • 编程式事务:需要在代码中进行事务的管理;

    • Spring中propagation的7种事务配置;

      • propagation=REQUIRED【Spring的默认配置】

 

  • 总结:

    • 为什么需要事务:如果不配置事务,可能存在数据提交不一致的情况下;

    • 如果我们不在Spring中去配置声明式事务,我们就需要在代码中手动配置事务;

    • 事务在项目开发中十分重要,涉及到数据的一致性问题!

 

  • 代码案例:pojo

    public class User {
       private int id;
       private String name;
       private String pwd;
    }
  • 代码案例:Mapper

    public interface UserMapper {

       List<User> selectUser();
       //添加一个用户
       int addUser(User user);
       //删除一个用户
       int deleteUser(User user);
    }
  • 代码案例:Mapper.xml

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
           PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
           "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

    <mapper namespace="com.xx.dao.UserMapper">

       <select id="selectUser" resultType="user">
          select * from mybatis.user
       </select>

       <insert id="addUser" parameterType="user">
          insert into mybatis.user(id, name, pwd) values (#{id},#{name},#{pwd})
       </insert>

       <delete id="deleteUser" parameterType="user">
          deletes from user where id=#{id}
       </delete>
    </mapper>
  • 代码案例:MapperImpl

    //为了整合Spring,创建SQLSession
    public class UserMapperImpl extends SqlSessionDaoSupport implements UserMapper {

       public List<User> selectUser() {

           User user = new User(8, "demo008", "888888");

           UserMapper mapper = getSqlSession().getMapper(UserMapper.class);
           //一组数据
           mapper.addUser(user);
           mapper.deleteUser(user);


           return mapper.selectUser();
      }

       public int addUser(User user) {
           UserMapper mapper = getSqlSession().getMapper(UserMapper.class);
           return mapper.addUser(user);
      }

       public int deleteUser(User user) {
           UserMapper mapper = getSqlSession().getMapper(UserMapper.class);
           return mapper.deleteUser(user);
      }
    }
  • 代码案例:Spring配置声明式事务

    <?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: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/tx
           https://www.springframework.org/schema/tx/spring-tx.xsd
           http://www.springframework.org/schema/aop
           https://www.springframework.org/schema/aop/spring-aop.xsd">

       <!--1,DataSource:使用Spring的数据源替换Mybatis的配置: c3p0,dbcp,druid
           我们这里使用Spring提供的JDBC
        -->
       <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
           <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
           <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=utf-8"/>
           <property name="username" value="root"/>
           <property name="password" value="root"/>
       </bean>

       <!--2,SqlSessionFactory-->
       <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
           <property name="dataSource" ref="dataSource" />
           <!--绑定Mybatis配置文件-->
           <property name="configLocation" value="classpath:mybatis-config.xml"/>
           <property name="mapperLocations" value="classpath:com/ljxdemo/dao/*.xml"/>
       </bean>

       <!--3,SqlSessionTemplate就是我们使用的SqlSession-->
       <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
           <!--只能通过构造器注入sqlSessionFactory,因为它没有set方法-->
           <constructor-arg index="0" ref="sqlSessionFactory"/>
       </bean>

       <!--配置声明式事务-->
       <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
           <constructor-arg ref="dataSource" />
       </bean>

       <!--结合AOP,实现事务的织入-->
       <!--1,配置事务通知:-->
       <tx:advice id="txADVICE" transaction-manager="transactionManager">
           <!--2,给哪些方法配置事务-->
           <!--3,配置事务的传播特性: new; propagation=REQUIRED -->
           <tx:attributes>
               <tx:method name="add" propagation="REQUIRED"/>
               <tx:method name="delete" propagation="REQUIRED"/>
               <tx:method name="query" read-only="true"/>
               <tx:method name="*" propagation="REQUIRED"/>
           </tx:attributes>
       </tx:advice>

       <!--   配置事务切入了 :
           1,切入点
           2,切入:就是通知
       -->
       <aop:config>
           <aop:pointcut id="txPointcut" expression="execution( * com.ljxdemo.dao.*.*(..))"/>
           <aop:advisor advice-ref="txADVICE" pointcut-ref="txPointcut"/>
       </aop:config>

       

    </beans>
  • 代码案例:Mybatis-config.xml

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration
           PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
           "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>

       <!--添加别名-->
       <typeAliases>
           <package name="com.ljxdemo.pojo"/>
       </typeAliases>

    </configuration>
  • 代码案例:Spring配置文件

    <?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: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/aop
           https://www.springframework.org/schema/aop/spring-aop.xsd">

      <import resource="spring-dao.xml"/>

      <bean id="userMapper" class="com.ljxdemo.dao.UserMapperImpl">
         <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
      </bean>


    </beans>
  • 测试;

 

 

 

posted @   gzs1024  阅读(42)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示