spingboot银行案例

2023-11-09 12:59
文章标签 案例 银行 spingboot

本文主要是介绍spingboot银行案例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.搭建环境

在这里插入图片描述

2.common

在这里插入图片描述

Account

public class Account implements Serializable {private Long id;private String cardno;private String password;private Double balance;private Long status;

Record

public class Record implements Serializable {private long id;private String cardno;private String transactiondate;private double expense;private double income;private double balance;private String transactiontype;private String remark;private String starttime;private String endtime;

AccountService

public interface AccountService {//1.登录Map<String,Object> login(Account account);//2.根据卡号查询余额Double findBalance(Account account);//3.修改密码String updatePWd(Account account);
}

RecordService

public interface RecordService {//1.转账String transferAccounts(String currentCardNo,String targetCardNo,Double money);//2.分页查询PageInfo<Map<String,Object>> showPage(Integer pageno, Record record);
}
3.provider结构

在这里插入图片描述

AccountMapper
public interface AccountMapper {//1.查询账号详情:根据卡号查,根据卡号密码查,根据卡号查余额Account findAccountInfo(Account account);//2.修改密码@Update("update account set password=#{password} where cardno#{cardno}")int updatePassword(Account account);//3.修改账号余额@Update("update account set balance=#{balance} where cardno#{cardno}")int updateBalance(Account account);
}
RecordMapper
public interface RecordMapper {//1.添加转出的交易记录@Insert("insert into record(cardno,transactiondate,expense,income,balance,transactiontype) values(#{cardno},now(),#{expense},0.0,#{balance},'转出')")int addExpenseRecord(Record record);//2.添加转入的交易记录@Insert("insert into record(cardno,transactiondate,expense,income,balance,transactiontype) values(#{cardno},now(),#{income},0.0,#{balance},'转入')")int addIncomeRecord(Record record);//3.根据交易日期分页查询,按照日期升序排列List<Map<String,Object>> showData(Record record);
}

AccountServiceImpl

@Service
@Transactional
public class AccountServiceImpl implements AccountService {@Autowiredprivate AccountMapper accountMapper;//登录@Overridepublic Map<String, Object> login(Account account) {Map<String, Object> map = new HashMap<String, Object>();//根据卡号查询Account loginuser = accountMapper.findAccountInfo(account);//判断卡号是否存在if (loginuser == null) {map.put("msg", "登录失败,你输入卡号不存在!");return map;}if(loginuser!=null){//判断密码是否正确if (!loginuser.getPassword().equals(account.getPassword())){map.put("msg","登录失败,您输入的密码不正确!");return map;}//判断账号是否被冻结if (loginuser.getStatus()==0){map.put("msg","登录失败,您的账号已冻结!");return map;}}//登录成功map.put("loginuser",loginuser);return map;}//查询余额@Overridepublic Double findBalance(Account account) {//根据卡号查询return accountMapper.findAccountInfo(account).getBalance();}//修改密码@Overridepublic String updatePWd(Account account) {String pwd = accountMapper.findAccountInfo(account).getPassword();if (!pwd.equals(account.getPassword())){return "旧密码输入错误!";}//修改accountMapper.updatePassword(account);return "success";}
}

RecordServiceImpl

public class RecordServiceImpl implements RecordService {@Autowiredprivate RecordMapper recordMapper;@Autowiredprivate AccountMapper accountMapper;//转账public String transferAccounts(String currentCardNo, String targetCardNo, Double money) {//查询目标账号Account targetAccount=accountMapper.findAccountInfo(new Account(targetCardNo,null,null));//判断目标卡号是否存在if(targetAccount==null){return "转账失败,目标账号不存在!";}//判断目标账号是否冻结if (targetAccount!=null && targetAccount.getStatus()==0){return "转账失败,目标账号已冻结";}//查询当前账号Account currentAccount=accountMapper.findAccountInfo(new Account(currentCardNo,null,null));//判断当前账号余额是否 >= 转账金额if (currentAccount!=null){if (currentAccount.getBalance()<money){return "转账失败,转出账号余额不足!";}}//当前账号余额减少currentAccount.setBalance(currentAccount.getBalance()-money);accountMapper.updateBalance(targetAccount);//目标账号余额增加targetAccount.setBalance(targetAccount.getBalance()+money);accountMapper.updateBalance(targetAccount);//当前账号转出交易记录Record currentAccountRecord=new Record(currentCardNo,money,null,currentAccount.getBalance());recordMapper.addExpenseRecord(currentAccountRecord);//目标账号转入交易记录Record targetAccountRecord=new Record(targetCardNo,null,money,targetAccount.getBalance());recordMapper.addIncomeRecord(targetAccountRecord);return "success";}//分页@Overridepublic PageInfo<Map<String, Object>> showPage(Integer pageno, Record record) {PageHelper.startPage(pageno,3);List<Map<String,Object>> list=recordMapper.showData(record);return new PageInfo<Map<String,Object>>(list);}
}

ProviderApplication

@MapperScan("cn.kgc.mapper")
@ImportResource("classpath:spring-provider.xml")
resource>mapper

AccountMapper.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="cn.kgc.mapper.AccountMapper"><select id="findAccountInfo" resultType="Account" parameterType="Account">SELECT * FROM account WHERE cardno=#{cardno}<if test="password!=null">AND password=#{password}</if></select>
</mapper>

RecordMapper.xml

<mapper namespace="cn.kgc.mapper.RecordMapper"><select id="showData" parameterType="Record" resultType="map">SELECT * from record WHERE cardno=#{cardno}<if test="starttime!=null and endtime!=nulll">AND transactiondate BETWEEN #{starttime} AND #{endtime}</if>ORDER BY transactiondate ASC</select>
</mapper>

application.properties

server.port=9090spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/bankonline
spring.datasource.username=root
spring.datasource.password=123.mybatis.type-aliases-package=cn.kgc.vomybatis.mapper-locations=mapper/*.xmlpagehelper.helper-dialect=mysql

spring-provider.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:dubbo="http://code.alibabatech.com/schema/dubbo"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://code.alibabatech.com/schema/dubbohttp://code.alibabatech.com/schema/dubbo/dubbo.xsd"><!-- 提供方应用信息,用于计算依赖关系 --><dubbo:application name="myprovider" /><!-- 使用zookeeper注册中心暴露服务地址,我的zookeeper是架在本地的 --><dubbo:registry protocol="zookeeper" address="127.0.0.1:2181" timeout="60000"/><!-- 用dubbo协议在20880端口暴露服务 --><dubbo:protocol name="dubbo" port="20880" /><!-- 用户服务接口 --><dubbo:service interface="cn.kgc.service.AccountService" ref="accountService"/><bean id="accountService" class="cn.kgc.service.AccountServiceImpl"/><dubbo:service interface="cn.kgc.service.RecordService" ref="recordService"/><bean id="recordService" class="cn.kgc.service.RecordServiceImpl"/>
</beans>

4.consumer

CenterController

@RestController
public class CenterController {@Autowiredprivate AccountService accountService;@Autowiredprivate RecordService recordService;//登录@RequestMapping("/login.do")public Map<String,Object> login(Account account){return accountService.login(account);}//查询余额@RequestMapping("/balance.do")public Double findBalance(Account account){return accountService.findBalance(account);}//修改密码@RequestMapping("/pwd.do")public String updatePWd(Account account){return accountService.updatePWd(account);}//转账@RequestMapping("/ta.do")public String transferAccounts(String currentCardNo,String targetCardNo,Double money){return recordService.transferAccounts(currentCardNo,targetCardNo,money);}//分页@RequestMapping("/page.do")public PageInfo<Map<String,Object>> showPage(Integer pageno, Record record){return recordService.showPage(pageno,record);}
}

ConsumerApplication

@ImportResource("classpath:spring-consumer.xml")

rvice.transferAccounts(currentCardNo,targetCardNo,money);
}
//分页
@RequestMapping("/page.do")
public PageInfo<Map<String,Object>> showPage(Integer pageno, Record record){
return recordService.showPage(pageno,record);
}
}


ConsumerApplication```java
@ImportResource("classpath:spring-consumer.xml")

这篇关于spingboot银行案例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/376237

相关文章

MyBatis分页查询实战案例完整流程

《MyBatis分页查询实战案例完整流程》MyBatis是一个强大的Java持久层框架,支持自定义SQL和高级映射,本案例以员工工资信息管理为例,详细讲解如何在IDEA中使用MyBatis结合Page... 目录1. MyBATis框架简介2. 分页查询原理与应用场景2.1 分页查询的基本原理2.1.1 分

深度解析Java @Serial 注解及常见错误案例

《深度解析Java@Serial注解及常见错误案例》Java14引入@Serial注解,用于编译时校验序列化成员,替代传统方式解决运行时错误,适用于Serializable类的方法/字段,需注意签... 目录Java @Serial 注解深度解析1. 注解本质2. 核心作用(1) 主要用途(2) 适用位置3

Java 正则表达式的使用实战案例

《Java正则表达式的使用实战案例》本文详细介绍了Java正则表达式的使用方法,涵盖语法细节、核心类方法、高级特性及实战案例,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录一、正则表达式语法详解1. 基础字符匹配2. 字符类([]定义)3. 量词(控制匹配次数)4. 边

Python Counter 函数使用案例

《PythonCounter函数使用案例》Counter是collections模块中的一个类,专门用于对可迭代对象中的元素进行计数,接下来通过本文给大家介绍PythonCounter函数使用案例... 目录一、Counter函数概述二、基本使用案例(一)列表元素计数(二)字符串字符计数(三)元组计数三、C

Spring Boot 整合 SSE(Server-Sent Events)实战案例(全网最全)

《SpringBoot整合SSE(Server-SentEvents)实战案例(全网最全)》本文通过实战案例讲解SpringBoot整合SSE技术,涵盖实现原理、代码配置、异常处理及前端交互,... 目录Spring Boot 整合 SSE(Server-Sent Events)1、简述SSE与其他技术的对

MySQL 临时表与复制表操作全流程案例

《MySQL临时表与复制表操作全流程案例》本文介绍MySQL临时表与复制表的区别与使用,涵盖生命周期、存储机制、操作限制、创建方法及常见问题,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随小... 目录一、mysql 临时表(一)核心特性拓展(二)操作全流程案例1. 复杂查询中的临时表应用2. 临时

MySQL 数据库表与查询操作实战案例

《MySQL数据库表与查询操作实战案例》本文将通过实际案例,详细介绍MySQL中数据库表的设计、数据插入以及常用的查询操作,帮助初学者快速上手,感兴趣的朋友跟随小编一起看看吧... 目录mysql 数据库表操作与查询实战案例项目一:产品相关数据库设计与创建一、数据库及表结构设计二、数据库与表的创建项目二:员

C#中的Drawing 类案例详解

《C#中的Drawing类案例详解》文章解析WPF与WinForms的Drawing类差异,涵盖命名空间、继承链、常用类及应用场景,通过案例展示如何创建带阴影圆角矩形按钮,强调WPF的轻量、可动画特... 目录一、Drawing 是什么?二、典型用法三、案例:画一个“带阴影的圆角矩形按钮”四、WinForm

setsid 命令工作原理和使用案例介绍

《setsid命令工作原理和使用案例介绍》setsid命令在Linux中创建独立会话,使进程脱离终端运行,适用于守护进程和后台任务,通过重定向输出和确保权限,可有效管理长时间运行的进程,本文给大家介... 目录setsid 命令介绍和使用案例基本介绍基本语法主要特点命令参数使用案例1. 在后台运行命令2.

RabbitMQ消费端单线程与多线程案例讲解

《RabbitMQ消费端单线程与多线程案例讲解》文章解析RabbitMQ消费端单线程与多线程处理机制,说明concurrency控制消费者数量,max-concurrency控制最大线程数,prefe... 目录 一、基础概念详细解释:举个例子:✅ 单消费者 + 单线程消费❌ 单消费者 + 多线程消费❌ 多