Spring 事务配置类,完成数据库的转账

news2024/12/28 6:44:02

1、完成基本的三层架构

1.1创建Account表

创建实体类 Account

1.2 Service层写入 AccountService 接口

Service层 下写 impl 包定义 AccountServiceImpl 类 实现接口 AccountService

@Service
@Transactional
@RequiredArgsConstructor
public class AccountServiceImpl implements AccountService {

    private final AccountDao accountDao;

    //    @Transactional 事务注解可以写再方法上,也可以写类上
    @Override
    public boolean transfer(String from, String to, double money) {
        //获取转入账号信息
        Account toAccount = accountDao.getAccountByAccount(to);
        if (toAccount == null) {
            System.out.println("账号不存在");
            return false;
        }
        if (toAccount.getStatus() == 1) {
            System.out.println("被禁用");
            return false;
        }
        //获取转出账号信息
        Account fromAccount = accountDao.getAccountByAccount(from);
        if (fromAccount.getMoney() <= money) {
            System.out.println("转出账号余额不足");
            return false;
        }
        //实现转账
        accountDao.addMoney(to, money);
        accountDao.subMoney(from, money);
        System.out.println("转账成功");
        return true;
    }
}

1.3 dao层写入 AccountDao 接口

dao层 下写 impl 包定义 AccountDaoImpl 类 实现接口 AccountDao

@Repository
@RequiredArgsConstructor
public class AccountDaoImpl implements AccountDao {

    private final JdbcTemplate jdbcTemplate;

    @Override
    public Account getAccountByAccount(String account) {
        String sql = "select * from account where account=?";
        return jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(Account.class),account);
    }

    @Override
    public int addMoney(String account, double money) {
        String sql = "update account set money=money+? where account=?";
        return jdbcTemplate.update(sql,money,account);
    }

    @Override
    public int subMoney(String account, double money) {
        //        int i=1/0;
        String sql = "update account set money=money-? where account=?";
        return jdbcTemplate.update(sql,money,account);
    }
}

2、事务配置类

2.1跟dao层同级创建config包,config包下创建SpringConfig类

//@Configuration 该类式一个配置类,相当于一个applicationContext.xml配置文件
@Configuration
//@ComponentScan 表示组件扫描(会扫描basePackages包下(包含子包)所有注解)
//相当于配置文件中得<context:component-scan/>
@ComponentScan(basePackages = "com.cxd")
//@PropertySource 表示properties配置文件得资源路径
//相当于 <context:property-placeholder location="classpath*:database.properties"/>
@PropertySource(value = "classpath:database.properties")

//@EnableTransactionManagement 开启事务管理
//相当于配置文件中得 <tx:annotation-driven/> 事务管理驱动
@EnableTransactionManagement

public class SpringConfig {

    //@Value写在属性上,表示读取配置文件中值注入到属性中
    @Value("${jdbc.driver}")
    private String driver;
    @Value("${jdbc.url}")
    private String url;
    @Value("${jdbc.username}")
    private String username;
    @Value("${jdbc.password}")
    private String password;

    /**
     * @Bean 写在配置类中得方法上 相当于配置文件中得 <bean></bean>标签
     * 其中得返回子就是<bean class=""></bean> class属性
     * bean在容器中得名字就是方法名
     * 数据源
     */
    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource =
        new DriverManagerDataSource();
        dataSource.setDriverClassName(driver);
        dataSource.setUrl(url);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        return dataSource;
    }

    @Bean
    public JdbcTemplate getJdbcTemplate(DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }

    @Bean
    //事务管理器
    public DataSourceTransactionManager transactionManager(DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);

    }

}

2.2数据库的连接

3、测试类

//@ContextConfiguration(locations = "classpath:applicationContext.xml")
@ContextConfiguration(classes = SpringConfig.class)
@RunWith(SpringJUnit4ClassRunner.class)
public class Test01 {

    @Autowired
    AccountDao accountDao;

    @Autowired
    AccountService accountService;

  
    @Test
    public void test02() {
        accountService.transfer("888888","666666",100);
    }

}

最后测试类,查看数据库数据

4、用到的jar包

@Repository
@RequiredArgsConstructor
public class AccountDaoImpl implements AccountDao {

    private final JdbcTemplate jdbcTemplate;

    @Override
    public Account getAccountByAccount(String account) {
        String sql = "select * from account where account=?";
        return jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(Account.class),account);
    }

    @Override
    public int addMoney(String account, double money) {
        String sql = "update account set money=money+? where account=?";
        return jdbcTemplate.update(sql,money,account);
    }

    @Override
    public int subMoney(String account, double money) {
        //        int i=1/0;
        String sql = "update account set money=money-? where account=?";
        return jdbcTemplate.update(sql,money,account);
    }
}

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

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

相关文章

【网络】高并发场景处理:线程池和IO多路复用

文章目录 短时间内有大量的客户端的解决方案线程池IO 多路复用 短时间内有大量的客户端的解决方案 创建线程是比较经典的一种服务器开发模型&#xff0c;给每个客户端分配一个线程来提供服务 但一旦短时间内有大量的客户端&#xff0c;并且每个客户端请求都是很快的&#xff…

电路笔记(PCB):串扰的原理与减少串扰的几种方法

串扰 串扰&#xff08;Crosstalk&#xff09;是指在电路中&#xff0c;一条信号线上的电磁干扰不经意间耦合到另一条相邻的信号线上&#xff0c;从而影响其正常信号传输的现象。串扰会导致相邻信号线上的信号出现畸变或噪声&#xff0c;从而影响信号的完整性和电路的正常工作。…

【ARM+Codesys 客户案例 】 基于RK3568/A40i/STM32+CODESYS在智能制造中的应用案例:液压动力装置

Poppe Potthoff是一家专门从事高压领域技术研发和产品制造的集团公司&#xff0c;该公司为汽车行业、特种车辆行业、船舶行业等开发制造先进的技术产品。 信迈提供ARMCodesys国产化定制。 Poppe Potthoff在其诺德豪森工厂研发用于爆破测试&#xff0c;自应力加工、脉冲测试和…

深度学习-------------------使用块的网络VGG

目录 VGGVGG块VGG架构进度总结 使用块的网络&#xff08;VGG&#xff09;VGG块VGG网络观察每层输出的形状该部分总代码 训练模型 VGG AlexNet比LeNet更深更大&#xff0c;以得到更好的精度 能不能更深和更大&#xff1f;该如何更深更大&#xff1f; 选项&#xff1a; 更多的…

阿里Qwen2开源大模型本地部署及调试全攻略

阿里Qwen2开源大模型本地部署及调试全攻略 #Qwen2系列大模型性能卓越&#xff0c;超越业界知名模型。开源后受到AI开发者关注&#xff0c;支持多种语言&#xff0c;提升多语言理解。在预训练和微调上优化&#xff0c;实现智能水平提升。Qwen2系列模型在各项能力上均领先&#…

基于NXP i.MX8M Mini+FPGA医疗超声诊断设备

医疗超声诊断设备 超声诊断仪&#xff0c;又称超声医疗影像设备&#xff0c;是利用超声波的反射、折射和衍射&#xff0c;对人体内部结构进行探查的仪器。由于超声诊断的无损伤、非介入、经济实用、应用范围广等特点&#xff0c;超声诊断仪也成为目前医疗领域普遍使用的医疗器…

C++_进阶:二叉搜索树

文章目录 1. 二叉搜索树是什么2. 二叉搜索树的基本操作3. 二叉搜索树的实现4 二叉搜索树的性能分析 1. 二叉搜索树是什么 二叉搜索树(BST&#xff0c;Binary Search Tree)又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树: 若它的左子树不…

汉诺塔问题详解及扩展(c++)

汉诺塔&#xff08;Hanoi Tower&#xff09;问题是一个著名的数学问题&#xff0c;它涉及到递归算法。问题的背景来源于一个传说&#xff1a;在印度的一个寺庙里&#xff0c;有三根金刚石柱和64个直径大小不一的金盘。僧侣们被命令将这些金盘从一根柱子按照从小到大的顺序移动到…

北京移民服务机构亨瑞移民:汇集全球专业顾问 30年致力全球生活方式

01      北京移民服务机构亨瑞集团成立于1992年&#xff0c;作为一站式海外综合服务专业平台&#xff0c;30年来致力于为有意赴海外求学、拓展事业、居住、生活、工作的各行业人士提供全球教育规划、身份规划及资产全球配置解决方案。    北京移民服务机构亨瑞集团公司…

在 C#/.NET Core 的 Web API 中使用 Swagger 按模块和版本分组并实现排序

文章目录 前言步骤一&#xff1a;安装 Swashbuckle.AspNetCore步骤二&#xff1a;创建自定义特性步骤三&#xff1a;配置 Swagger 生成文档步骤四&#xff1a;标记控制器和方法总结 前言 在开发 RESTful API 时&#xff0c;良好的文档是必不可少的。Swagger 是一种广泛使用的 …

C/C++ 多线程[1]---线程创建+线程释放+实例

文章目录 前言1. 多线程创建2. 多线程释放3. 实例总结 前言 说来惭愧&#xff0c;写了很久的代码&#xff0c;一个单线程通全部。可能是接触的项目少吧&#xff0c;很多多线程的概念其实都知道&#xff0c;但是实战并没有用上。前段时间给公司软件做一个进度条&#xff0c;涉及…

【Docker系列】Docker 容器时区设置指南

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

中国式现代化产业水平数据集(2011-2021年)

中国式现代化是一种社会主义现代化模式&#xff0c;它具有自己独特的特征和发展路径。这一现代化模式以实现国家富强、民族振兴和人民幸福为目标&#xff0c;强调物质文明与精神文明的协调发展以及人与自然的和谐共生 本文将中国式现代化理念与现代化产业体系相结合&#xff0…

希亦、洁盟、苏泊尔眼镜清洗机哪款好用?热门眼镜清洗机测评总结

随着科学技术的发展&#xff0c;电子设备的升级&#xff0c;越来越多的人开始戴眼镜&#xff0c;而眼镜由于长时间的佩戴&#xff0c;镜框以及镜面都积累了一些灰尘以及人们肉眼所看不见的细菌&#xff0c;但是如果你使用普通的清洁方式去清洗的话肯定是清洗不干净的&#xff0…

记录|Label组件如何控制下边框为直线

目录 前言一、问题描述二、重绘三、效果展示更新时间 前言 参考文章&#xff1a; C# WinForm开发时&#xff0c;仅显示label的下边框怎么解决啊&#xff1f; 验证过&#xff0c;方法可靠。并增加控制绘制的直线粗细的功能。 一、问题描述 C# winform中想只给Label组件的下边框…

佳能FAX-L160G打印机驱动程序安装

佳能FAX-L160G打印机驱动程序安装笔记 1.访问佳能官方网站https://www.canon.com.cn或者相关驱动下载网站&#xff0c;搜索并下载适用于佳能FAX-L160G打印机的驱动程序。 在这里跳出来相关系列&#xff08;没有精确的型号&#xff09;&#xff0c;点进去搜索。 选择第一个驱动…

强化进度慢,武忠祥17堂课怎么听最高效?

武忠祥老师的17堂课怎么看&#xff1f; 我的建议是&#xff0c;别乱看&#xff01; 17讲内容包括15个主要专题和2个附加专题&#xff0c;整体课时量还是相当大的。 以2023版的课时长度为例&#xff0c;即使你全程以1.5倍速观看且不做任何停顿&#xff0c;平均每个专题至少也…

系统项目管理师----高级----前情调研

要成功通过信息系统项目管理师的考试&#xff0c;需要系统性的学习和多方面的准备。以下是详细的学习资源、推荐的书籍和具体的备考步骤。 一、学习资源与网站 1. 官方网站与指南 中国计算机技术职业资格网&#xff1a;这是软考的官方网站&#xff0c;提供考试大纲、政策法规…

Java编程 : 对象的本质

1.1 从机器视角到问题视角的演变 在计算机科学的发展历程中&#xff0c;我们见证了从机器视角到问题视角的深刻转变。这一转变不仅体现了编程语言和技术的进步&#xff0c;更反映了我们对问题解决方式理解的深化。 起初&#xff0c;计算机编程主要依赖于机器视角。汇编语言作…

FPGA串口调试中当电脑串口无法正常通信,设备管理器中“其它设备”位置显示“USB-Blaster”显示感叹号等问题应该怎么解决?

一、问题描述 当我们进行FPGA开发关于串口等试验的设计中&#xff0c;都需要用到串口&#xff0c;而要使用串口就需要先安装串口驱动&#xff0c;但是在安装驱动的过程中会出现各种各样的问题。 这里就出现了如图所示的停产问题&#xff1a; 在图片中我们可以看到FPGA要使…