利用事务实现转账功能!!!(基础版)

 搭建环境:利用下边环境即可!!!

   Spring整合MyBatis框架!!!-CSDN博客

需要修改的文件:

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"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><!--ioc,扫描包,将其加入ioc工厂--><context:component-scan base-package="com.by.service, com.by.advice"></context:component-scan><!--加载db.properties--><context:property-placeholder location="db.properties"></context:property-placeholder><!--配置数据源DruidDataSource dataSource = new DruidDataSource();dataSource.setDriverClassName();dataSource.setUrl();dataSource.setUsername();dataSource.setPassword();--><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close"><property name="driverClassName" value="${jdbc.driverClass}"></property><property name="url" value="${jdbc.url}"></property><property name="username" value="${jdbc.username}"></property><property name="password" value="${jdbc.password}"></property></bean><!--SqlSessionFactoryBuilder sessionFactoryBuilder = new SqlSessionFactoryBuilder();SqlSessionFactory sessionFactory = sessionFactoryBuilder.build("");SqlSession sqlSession = sessionFactory.openSession();Object mapper = sqlSession.getMapper();--><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource"></property></bean><!--扫描basePackage所指定的包下的所有接口,生成代理类并交给spring管理--><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><!--mapper所在的包--><property name="basePackage" value="com.by.mapper"></property><property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property></bean><!--aop自动注入--><aop:aspectj-autoproxy></aop:aspectj-autoproxy><!--配置事务管理器--><bean  class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><!--<property name="dataSource" ref="dataSource"></property>--><constructor-arg name="dataSource" ref="dataSource"></constructor-arg></bean><!--配置事务的相关属性--><bean  class="org.springframework.transaction.support.DefaultTransactionDefinition"><!--1)隔离级别【有默认值】DEFAULT:默认值,等价于REPEATABLE_READREAD_UNCOMMITTEDREAD_COMMITTED      脏读       x              xREPEATABLE_READ     脏读      不可重复度SERIALIZABLE        脏读      不可重复度       幻读2)事务的传播行为【有默认值】REQUIRED:默认值,methodB()会加入到methodA()事务中3)事务超时【有默认值】默认-1:永不超时4)是否只读【有默认值】readOnly = false:默认值,适用于增删改readOnly = true:不记录log(效率快),适用于查询5)回滚规则可省略:运行时异常回滚,编译时异常不回滚--></bean>
</beans>

 UserService:

package com.by.service;import com.by.pojo.User;/*** <p>Project: Spring - UserService</p>* <p>Powered by scl On 2024-01-05 21:24:07</p>* <p>描述:<p>** @author 孙臣龙 [1846080280@qq.com]* @version 1.0* @since 17*/
public interface UserService {void addUser(User user);void updateUser(String source, String target, float money);
}

 UserServiceImpl:

package com.by.service;import com.by.mapper.UserMapper;
import com.by.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;@Service
public class UserServiceImpl implements UserService {@Autowiredprivate UserMapper userMapper;@Autowiredprivate PlatformTransactionManager platformTransactionManager;@Autowiredprivate TransactionDefinition transactionDefinition;@Overridepublic void addUser(User user) {userMapper.addUser(user);}@Overridepublic void updateUser(String source, String target, float money) {TransactionStatus transaction = platformTransactionManager.getTransaction(transactionDefinition);try {userMapper.subUserMoney(source,money);System.out.println(6/0);userMapper.addUserMoney(target,money);platformTransactionManager.commit(transaction);} catch (Exception e) {e.printStackTrace();platformTransactionManager.rollback(transaction);}}
}

 UserMapper:

package com.by.mapper;import com.by.pojo.User;
import org.apache.ibatis.annotations.Param;public interface UserMapper {public void addUser(User user);void addUserMoney(@Param("target") String target, @Param("money") float money);void subUserMoney(@Param("source") String source, @Param("money") float money);
}

UserMapper.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.by.mapper.UserMapper"><insert id="addUser" parameterType="com.by.pojo.User">insert into t_user(name, money)values (#{name}, #{money})</insert><update id="addUserMoney">update t_user set money=money+#{money} where name=#{target}</update><update id="subUserMoney">update t_user set money=money-#{money} where name=#{source}</update>
</mapper>

测试类:

/** Copyright (c) 2020, 2024,  All rights reserved.**/
package com.by.web;import com.by.service.UserService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;/*** <p>Project: Spring - ClientUserMoney</p>* <p>Powered by scl On 2024-01-06 11:08:15</p>* <p>描述:<p>** @author 孙臣龙 [1846080280@qq.com]* @version 1.0* @since 17*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class ClientUserMoney {@Autowiredprivate UserService userService;@Testpublic void updateUser(){userService.updateUser("宋远桥","李星云",5f);}
}

注意:

要实现事务需要将事务交给ioc容器进行管理。配置bean的思路,用接口的实现类去配置

1、PlatformTransactionManager
        作用:是一个事务管理器,负责开启、提交或回滚事务
        实现类:DataSourceTransactionManager(sqlSession)
    2、TransactionDefinition
        作用:定义事务的属性
        实现类:DefaultTransactionDefinition
        属性:
            1)隔离级别【有默认值】
                DEFAULT:默认值,等价于REPEATABLE_READ
                READ_UNCOMMITTED
                READ_COMMITTED      脏读       x              x
                REPEATABLE_READ     脏读      不可重复度
                SERIALIZABLE        脏读      不可重复度       幻读
            2)事务的传播行为【有默认值】
                REQUIRED:默认值,methodB()会加入到methodA()事务中
            3)事务超时【有默认值】
                默认-1:永不超时
            4)是否只读【有默认值】
                readOnly = false:默认值,适用于增删改
                readOnly = true:不记录log(效率快),适用于查询
            5)回滚规则
                可省略:运行时异常回滚,编译时异常不回滚

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/602532.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Keil5,ARM编译器限制

根据 ISO C 标准的要求&#xff0c;介绍与翻译相关的 Arm C 编译器和 C 库的实现定义方面。 第 5.2.4.1 节 ISO/IEC 9899&#xff1a;2011 标准的翻译限制要求符合的编译器必须接受的最低翻译限制。下表汇总了这些限制。在此表中&#xff0c;限制 <memory> 表示 Arm Comp…

DFS-体积

DFS-体积 题目&#xff1a; 给出n件物品&#xff0c;每件物品有一个体积Vi&#xff0c;求从中取若干件物品能够组成不同的体积和有多少种可能。例如&#xff0c;n3&#xff0c;Vi(1,3,4),那么输出6,6种不同的体积分别为1,3,4,5,7,8 输入格式&#xff1a; 第一行一个正整数&…

一文讲透Python数据分析可视化之直方图(柱状图)

直方图&#xff08;Histogram&#xff09;又称柱状图&#xff0c;是一种统计报告图&#xff0c;由一系列高度不等的纵向条纹或线段表示数据分布的情况。一般用横轴表示数据类型&#xff0c;纵轴表示分布情况。通过绘制直方图可以较为直观地传递有关数据的变化信息&#xff0c;使…

关于“Python”的核心知识点整理大全65

目录 20.2.19 设置 SECRET_KEY 20.2.20 将项目从 Heroku 删除 注意 20.3 小结 附录 A 安装Python A.1.1 确定已安装的版本 A.1.2 在 Linux 系统中安装 Python 3 A.2 在 OS X 系统中安装 Python A.2.1 确定已安装的版本 A.2.2 使用 Homebrew 来安装 Python 3 注意 …

ejs默认配置 原型链污染

文章目录 ejs默认配置 造成原型链污染漏洞背景漏洞分析漏洞利用 例题 [SEETF 2023]Express JavaScript Security ejs默认配置 造成原型链污染 参考文章 漏洞背景 EJS维护者对原型链污染的问题有着很好的理解&#xff0c;并使用非常安全的函数清理他们创建的每个对象 利用Re…

高校选课系统需求分析开发源码

高校学生选课报名系统包括学生、教师和管理员三方的功能需求&#xff0c;学生的需求是查询院系的课程、选课情况及个人信息修改&#xff1b;教师则需要查看和查询所有课程信息及自己的课程信息以及教师信息的修改&#xff1b;管理员则负责更为复杂的任务&#xff0c;包括对学生…

opencv007 图像运算——加减乘除

今天学习图像处理的基础——加减乘除&#xff0c;总体来说比较好理解&#xff0c;不过生成的图片千奇百怪哈哈哈哈 opencv中图像的运算本质是矩阵的运算 加法 做加法之前要求两张图片形状&#xff0c;长宽&#xff0c;通道数完全一致 cv2.add(img1, img2) add的规则是两个图…

HTML 使用 ruby 给汉字加拼音

使用 ruby 给汉字加拼音 兼容性 使用 ruby 给汉字加拼音 大家有没有遇到过要给汉字头顶上加拼音的需求? 如果有的话, 你是怎么解决的呢? 如果费尽心思, 那么你可能走了很多弯路, 因为 HTML 原生就有这样的标签来帮我们实现类似的需求. <ruby> ruby 本身是「红宝石」…

leetcode 每日一题 2023年12月30日 一周中的第几天

题目 给你一个日期&#xff0c;请你设计一个算法来判断它是对应一周中的哪一天。 输入为三个整数&#xff1a;day、month 和 year&#xff0c;分别表示日、月、年。 您返回的结果必须是这几个值中的一个 {"Sunday", "Monday", "Tuesday", &qu…

JavaScript中的数组使用及常见属性方法

文章目录 一.什么是数组&#xff1f;二.数组的使用三、数组的方法四、数组总结 一.什么是数组&#xff1f; 在JavaScript中&#xff0c;数组是一种特殊的对象&#xff0c;用于存储和操作多个值。与其他编程语言不同&#xff0c;可以同时存储不同类型的值&#xff0c;并且长度是…

transforms图像增强(二)

一、图像变换 1、transforms.Pad transforms.Pad是一个用于对图像边缘进行填充的数据转换操作。 参数&#xff1a; padding&#xff1a;设置填充大小。可以是单个整数&#xff0c;表示在上下左右四个方向上均填充相同数量的像素&#xff1b;也可以是一个包含两个整数的元组…

Python学习笔记第八十天(OpenCV图像操作)

Python学习笔记第八十天 OpenCV图像操作图像读取与显示像素值访问与修改图像属性获取ROI定义与处理通道拆分与合并图像边框设置 后记 OpenCV图像操作 图像读取与显示 在开始任何图像处理之前&#xff0c;我们需要先读取图像。OpenCV提供了cv2.imread函数用于读取图像。这个函…

【Xilinx FPGA】异步 FIFO 的复位

FIFO&#xff08;First-In-First_Out&#xff0c;先入先出&#xff09;是一种的存储器类型&#xff0c;在 FPGA 开发中通常用于数据缓存、位宽转换或者跨时钟域&#xff08;多 bit 数据流&#xff09;。在使用异步 FIFO 时&#xff0c;应注意复位信号是否遵循相关要求和规范&am…

MySQL Mysqldump 一致性备份与大数据库备份 与 PG MYSQL 到底谁是NO.1

这开头还是介绍一下群&#xff0c;如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, Oceanbase, Sql Server等有问题&#xff0c;有需求都可以加群群内&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;&#xff08;共1830人左右 1 2 3 4 5&#xf…

android apk文件的签名问题

android的APK文件实际上是一个jar文件。jar的意思是瓶、罐&#xff0c;那就意味着jar文件是一个用来存放android应用相关文件的容器。事实上&#xff0c;它也确实如此&#xff0c;它只是一个带或不带压缩的zip文件&#xff0c;当你把.apk后缀改成.zip后&#xff0c;就能对此进行…

Web网页开发-总结笔记1

1. 主流浏览器都有哪些&#xff08;最少五个&#xff09;&#xff1f; 火狐浏览器、谷歌浏览器、IE浏览器、Edge浏览器、Opera浏览器、Safari浏览器2. 常见的浏览器内核都有哪些&#xff1f; IE &#xff1a;Trident 火狐&#xff1a;Gecko 苹果&#xff1a;Webkit 谷歌、欧朋、…

C/C++ 位段

目录 什么是位段&#xff1f; 位段的内存分配 位段的跨平台问题 什么是位段&#xff1f; 位段的声明与结构是类似的&#xff0c;但是有两个不同&#xff1a; 位段的成员必须是 int、unsigned int 或signed int 等整型家族。位段的成员名后边有一个冒号和一个数字 这是一个…

SSH远程连接

1 背景 在多处理器的分布式架构中&#xff0c;不同的ROS系统之间可能会频繁的涉及到文件的传输。   例如:我们在PC端编写ROS程序&#xff0c;而最终需要在Jetson nano上运行&#xff0c;如何将相关目录以及文件从PC上传到Jetson nano&#xff1f;这便需要使用SSH工具。 2 概…

im6ull学习总结(三-3)freetype

1、Freetype简介 FreeType是一个开源的字体渲染引擎&#xff0c;主要用于将字体文件转换为位图或矢量图形&#xff0c;并在屏幕上渲染出高质量的字体。它提供了一组API&#xff0c;使开发者能够在自己的应用程序中使用和呈现字体。 FreeType最初是作为一个独立项目开发的&…

[Excel]如何找到非固定空白格數列的條件數據? 以月份報價表單為例

在群組中看到上述問題&#xff0c;研判應是一份隨月份變動的產品報價表單&#xff0c;空白欄可能表示該月份價格與上個月份一致。這個問題是需要取得最近一次單價和倒數第二次單價&#xff0c;常用且實務的excel案例值得紀錄。 最近一次單價: INDEX($B2:$G2,1,LARGE(IF(ISBLAN…