80.【Spring5】(八)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 80.【Spring5】

(十五)、事务回顾

1.回顾事务

  • 把一组业务当成一个业务来做;要么都成功,要么都失败
  • 事务在项目开发中,十分的重要,涉及到数据的一致性问题,不能马虎
  • 确保完整性和一致性
(1).ACID
  • 原子性
  • 一致性
  • 隔离性:多个数据操作同一个资源
  • 持久性: 事务一旦提交,结果都不会再影响

2.Spring的增删改业务实现

实体类

package Com.Jsxs.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@AllArgsConstructor
@NoArgsConstructor
@Data
public class User {
    private int id;
    private String name;
    private String pwd;
}

接口

package Com.Jsxs.Mapper;
import Com.Jsxs.pojo.User;
import java.util.List;
public interface UserMapper {
//    查询所有的用户
    List<User> selectUser();
//    添加一个用户
    int addUser(User user);
//    删除一个用户
    int deleteUser(int id);
}

接口实现类

package Com.Jsxs.Mapper;
import Com.Jsxs.pojo.User;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.support.SqlSessionDaoSupport;
import java.util.List;
public class UserMapperImpl extends SqlSessionDaoSupport implements UserMapper{
//    进行全部信息的查询
    @Override
    public List<User> selectUser() {
        UserMapper mapper = getSqlSession().getMapper(UserMapper.class);
        User user = new User(7,"说的","54545");
        mapper.addUser(user);
        mapper.deleteUser(7);
        return mapper.selectUser();
    }
//    进行数据的添加
    @Override
    public int addUser(User user) {
        return getSqlSession().getMapper(UserMapper.class).addUser(user);
    }
//   进行数据的删除
    @Override
    public int deleteUser(int id) {
        return getSqlSession().getMapper(UserMapper.class).deleteUser(id);
    }
}

接口配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="Com.Jsxs.Mapper.UserMapper">
<!--    进行数据的全部信息查询-->
    <select id="selectUser" resultType="Com.Jsxs.pojo.User">
        select *from mybatis.user
    </select>
<!-- 进行数据的添加-->
    <insert id="addUser" parameterType="Com.Jsxs.pojo.User">
        insert into user values(#{id},#{name},#{pwd})
    </insert>
<!--  进行数据的删除  -->
    <delete id="deleteUser" parameterType="int">
        delete from user where id=#{id}
    </delete>
</mapper>

mybatis核心文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-config.dtd">
<!--configuration核心配置文件-->
<configuration>
</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"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
">
<!--
DateSource: 使用Spring的数据源替换MyBatis的配置
我们这里使用Spring-Jdbc依赖提供的类 : org.springframework.jdbc.datasource.DriverManagerDataSource
-->
    <bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=false&amp;useUnicode=true&amp;charEncoding=UTF8"/>
        <property name="username" value="root"/>
        <property name="password" value="121788"/>
    </bean>
    <!--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/Jsxs/Mapper/*.xml"/>
    </bean>
    <!--    SqlSessionTemplate: 就是我们需要用的sqlSession-->
<!--    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">-->
<!--        &lt;!&ndash;       只能利用构造器注入 sqlSessionFactory,因为他没有set方法&ndash;&gt;-->
<!--        <constructor-arg index="0" ref="sqlSessionFactory"/>-->
<!--    </bean>-->
</beans>

汇总文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
">
    <import resource="spring-dao.xml"/>
    <!--创建bean1-->
    <bean id="user1" class="Com.Jsxs.Mapper.UserMapperImpl">
        <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
    </bean>
</beans>

测试

import Com.Jsxs.Mapper.UserMapper;
import Com.Jsxs.pojo.User;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.List;
public class MyTest {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
        UserMapper user1 = context.getBean("user1", UserMapper.class);
        List<User> userList = user1.selectUser();
        for (User user : userList) {
            System.out.println(user);
        }
    }
}

3.继承SqlSessionDaoSupport

  • 在spring核心文件中可以不用写第三个factory的豆
  • 自动帮我们进行提交事务,不用手动提交了

4.Spring声明事务

Spring中的事务管理

  • 声明式事务: AOP
  • 编程式事务:需要在代码中进行事务的管理
(1).基本要求
(1).接口
package Com.Jsxs.Mapper;
import Com.Jsxs.pojo.User;
import java.util.List;
public interface UserMapper {
//    查询所有的用户
    List<User> selectUser();
//    添加一个用户
    int addUser(User user);
//    删除一个用户
    int deleteUser(int id);
}
(2).mapper.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="Com.Jsxs.Mapper.UserMapper">
<!--    进行数据的全部信息查询-->
    <select id="selectUser" resultType="Com.Jsxs.pojo.User">
        select *from mybatis.user
    </select>
<!-- 进行数据的添加-->
    <insert id="addUser" parameterType="Com.Jsxs.pojo.User">
        insert into user values(#{id},#{name},#{pwd})
    </insert>
<!--  进行数据的删除  -->
    <delete id="deleteUser" parameterType="int">
        deletes from user where id=#{id}
    </delete>
</mapper>
(3).接口实现类【new】
mapper.addUser(user);
mapper.deleteUser(7);.
在select方法中进行添加和删除;
package Com.Jsxs.Mapper;
import Com.Jsxs.pojo.User;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.support.SqlSessionDaoSupport;
import java.util.List;
public class UserMapperImpl extends SqlSessionDaoSupport implements UserMapper{
//    进行全部信息的查询
    @Override
    public List<User> selectUser() {
        UserMapper mapper = getSqlSession().getMapper(UserMapper.class);
        User user = new User(7,"说的","54545");
        mapper.addUser(user);
        mapper.deleteUser(7);
        return mapper.selectUser();
    }
//    进行数据的添加
    @Override
    public int addUser(User user) {
        return getSqlSession().getMapper(UserMapper.class).addUser(user);
    }
//   进行数据的删除
    @Override
    public int deleteUser(int id) {
        return getSqlSession().getMapper(UserMapper.class).deleteUser(id);
    }
}
(4).实体类
package Com.Jsxs.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@AllArgsConstructor
@NoArgsConstructor
@Data
public class User {
    private int id;
    private String name;
    private String pwd;
}
(5).mybatis核心文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-config.dtd">
<!--configuration核心配置文件-->
<configuration>
</configuration>
(6).Spring核心文件【new】
(1).命令开启事务
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <constructor-arg ref="datasource" />
</bean>
(2).结合Aop进行切面添加事务
(3).配置事务通知
<tx:advice id="txAdvice" transaction-manager="transactionManager">
(4).给哪些方法配置事务(需要添加约束) name: 需要添加事务接口的方法名 propagation 事务权限
 <tx:attributes>
            <tx:method name="addUser" propagation="REQUIRED"/>
            <tx:method name="deleteUser" propagation="REQUIRED"/>
            <tx:method name="selectUser" propagation="REQUIRED"/>
</tx:attributes>
(5).配置事务切入
<aop:config>
        <aop:pointcut id="pointcut" expression="execution(* Com.Jsxs.Mapper.*.*(..))"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut"/>
</aop:config>
<?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:tx="http://www.springframework.org/schema/tx"
       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/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
">
<!--
DateSource: 使用Spring的数据源替换MyBatis的配置
我们这里使用Spring-Jdbc依赖提供的类 : org.springframework.jdbc.datasource.DriverManagerDataSource
-->
    <bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=false&amp;useUnicode=true&amp;charEncoding=UTF8"/>
        <property name="username" value="root"/>
        <property name="password" value="121788"/>
    </bean>
    <!--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/Jsxs/Mapper/*.xml"/>
    </bean>
    <!--    SqlSessionTemplate: 就是我们需要用的sqlSession-->
<!--    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">-->
<!--        &lt;!&ndash;       只能利用构造器注入 sqlSessionFactory,因为他没有set方法&ndash;&gt;-->
<!--        <constructor-arg index="0" ref="sqlSessionFactory"/>-->
<!--    </bean>-->
<!--    配置声明式事务-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <constructor-arg ref="datasource" />
    </bean>
<!--    结合AOP实现事物的植入-->
<!--配置事务通知:-->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
<!--
    给哪些方法进行配置事务
    配置事务的传播特性: propagation
    name: 指向配置事务的方法名
-->
        <tx:attributes>
            <tx:method name="addUser" propagation="REQUIRED"/>
            <tx:method name="deleteUser" propagation="REQUIRED"/>
<!--            <tx:method name="update" propagation="REQUIRED"/>-->
            <tx:method name="selectUser" propagation="REQUIRED"/>
        </tx:attributes>
    </tx:advice>
<!--    配置事务切入-->
    <aop:config>
        <aop:pointcut id="pointcut" expression="execution(* Com.Jsxs.Mapper.*.*(..))"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut"/>
    </aop:config>
</beans>
(7).applicationContext.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"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
">
    <import resource="spring-dao.xml"/>
    <!--创建bean1-->
    <bean id="user1" class="Com.Jsxs.Mapper.UserMapperImpl">
        <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
    </bean>
</beans>
(8).测试
import Com.Jsxs.Mapper.UserMapper;
import Com.Jsxs.pojo.User;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.List;
public class MyTest {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
        UserMapper user1 = context.getBean("user1", UserMapper.class);
        List<User> userList = user1.selectUser();
        for (User user : userList) {
            System.out.println(user);
        }
    }
}

(9).效果展示

我们因为对查询的方法进行了切面(AOP)的操作,并且我们给事务增加,删除和查询都进行事务的管理,添加了事务。所以我们在进行设置查询的时候;查询的方法内涵着(添加和删除),我们故意在删除的时候埋下埋伏,验证成功事务设置成功;不会添加信息7

5.为什么要使用事务

  1. 如果不配置事务,可能存在数据提交不一致的情况
  2. 如果我们不在Spring中去配置声明式事务,我们就需要在代码中进行手动
  3. 事务在项目中十分重要,涉及到数据的一致性和完整性问题,不能马虎。
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
6月前
|
XML Java 开发者
【Spring】Spring是什么?
【Spring】Spring是什么?
【Spring】Spring是什么?
|
Java Spring 容器
Spring(1)
Spring(1)
39 0
|
3月前
|
Java 开发者 Spring
Spring之AutowiredAnnotationBeanPostProcessor
`AutowiredAnnotationBeanPostProcessor`是Spring自动装配机制的核心组成部分,为开发者提供了强大的依赖注入功能。通过识别 `@Autowired`及其他相关注解,它可以减少设置依赖的样板代码,允许快速和容易地集成不同的Spring组件。由于其在Spring框架中的关键作用,掌握其原理和用法对于深入理解和正确使用Spring框架至关重要。通过其提供的默认功能以及定制化扩展能力,`AutowiredAnnotationBeanPostProcessor`能够满足各种复杂场景下的依赖注入需求。
56 0
|
4月前
|
XML Java 数据格式
Spring
【7月更文挑战第8天】
44 3
|
6月前
|
缓存 前端开发 Java
|
6月前
|
存储 Java 数据库
【Spring】——Spring简单 读和取(一)
【Spring】——Spring简单 读和取
76 0
【Spring】——Spring简单 读和取(一)
|
6月前
|
存储 设计模式 Java
【Spring】——Spring简单 读和取(二)
【Spring】——Spring简单 读和取
64 0
【Spring】——Spring简单 读和取(二)
|
6月前
|
前端开发 Java 开发者
【Spring】 ——初识Spring
【Spring】 ——初识Spring
58 0
|
11月前
|
Java 应用服务中间件 程序员
spring
spring
76 0
|
XML 开发框架 Java
Spring详细总结1
1.Spring简介 1.1 Spring概述 (1)Spring 是最受欢迎的企业级 Java 应用程序开发框架,数以百万的来自世界各地的开发人员使用Spring 框架 来创建性能好(spring为我们提供对象的创建)、易于测试(整合了Junit)、可重用的代码(例如把事务的代码放到切面中, 再把切面作用于方法中)。
191 0
Spring详细总结1