一、准备工作

新建一个数据库,数据库名字是tokenLogin,数据库内新建两张表,第一张是用户账户信息表,第二张是转账、入账、出账记录表,分别如下所示:

1. sys_user用户账户信息表:

CREATE TABLEtokenLogin.sys_user(

`id`bigint NOT NULL comment 'ID',

`username`varchar(50) comment '用户名',

`password`varchar(50) comment '密码',PRIMARY KEY(`id`)

);insert into tokenLogin.sys_user values('1' , 'admmin' , '1')insert into tokenLogin.sys_user values('2' , 'superadmmin' , '11')insert into tokenLogin.sys_user values('3' , 'user' , '111')alter table tokenLogin.sys_user add column account double default null;

接着对account进行赋值,赋值完成后表内容如下:

2. 转账记录表:

CREATE TABLEtokenLogin.trasf_record(

`id`int NOT NULLAUTO_INCREMENT,

`username`varchar(50) default null,

`account_time`TIMESTAMP DEFAULT now() , /*交易时间,默认是几率生成的时间,也就是交易操作完成的时间*/`old_account`double default null, /*原账户的余额*/`new_account`double default null, /*交易后账户最新余额*/`target_account`varchar(50) default null , /*交易对方账户*/`account_type`varchar(50) default null , /*交易类型*/

PRIMARY KEY(`id`)

);alter table tokenLogin.trasf_record add column transaction_amount double default null after old_account ; /*在原账户余额和交易后账户余额中间插入交易余额*/

创建一张空表即可,后面产生交易的时候将数据插入,实现资金追溯。

3. 常量设置:在转账记录表中,有一个字段account_type , 这个字段无非有两个结果,要么是入账类型,要么是出账类型,所以这里我们进行常量设置。

在constants包下面新建TransactionType类,类下内容如下:

/***@authoryeyuting

* @create 2021/2/18*/

public classTransactionType {public static final String SAVEMONEY = "入账";public static final String WITHDRAWMONEY = "出账";

}

这样一来,准备工作就做好了,现在我们依次来实现账户余额查询、转账、入账和出账记录。

二、账户余额查询

1. 首先控制层创建余额查询接口:

@GetMapping("/selectByUserName")public Result selectByUserName(@RequestParam("userName") String username){returnResults.successWithData(userService.selectByUserName(username) , BaseEnums.SUCCESS.code()) ;

}

2. service层进行数据传递:

//UserService类:

publicUser selectByUserName(String username) ;//UserServiceImpl类://查询金额

publicUser selectByUserName(String username) {returnuserMapper.selectByUserName(username) ;

}

3. mapper层,将参数进行传递并和数据库打交道:

UserMapper.java:

public User selectByUserName(String username) ;

userMapper.xml:

select * from sys_user where username = #{userName}

4. 进行登陆操作,访问LoginCheck接口,生成对应的token,将token塞到余额查询接口的头信息中,过拦截器,进而顺利执行接口代码逻辑。

4. postman前端模拟:

这样一来,最简单的账户余额查询就实现了。

三、转账功能实现:

1. controller层创建转账接口:

@PostMapping("/transferAccount")public Result transferAccount (@RequestParam("accountMoney") Double accountMoney ,

@RequestParam("targetAccount") String targetAccount , HttpServletRequest request){returnResults.successWithData(userService.transferAccount(accountMoney , targetAccount , request) , BaseEnums.SUCCESS.code()) ;

}

2. service层实现:

service接口:

//转账

public String transferAccount(Double accountMoney , String targetAccount , HttpServletRequest request) ;

serviceImpl实现:

//转账

publicString transferAccount(Double accountMoney , String targetAccount , HttpServletRequest request){

Jedis jedis=jedisUtil.getSource() ;

String token= request.getHeader("token") ;

String userName=jedis.get(token) ;

User user=userMapper.selectByName(userName) ;double nowAccountMoney =user.getAccount() ;if(accountMoney >nowAccountMoney){return "余额不足";

}

User user1=userMapper.selectByName(targetAccount) ;if (user1.equals(null)){return "对方账户不存在";

}//转出账户余额更新

boolean result =userMapper.updateAccountOut(accountMoney , userName) ;//转入账户余额更新

boolean result1 =userMapper.updateAccountIn(accountMoney , user1.getUserName()) ;if ((result == false)||(result1 == false) ){return "转账操作失败";

}//转账记录生成------------//String accountType = TransactionType.WITHDRAWMONEY ;//出账记录生成

boolean insertReult =userMapper.accountOutInsert(userName ,user.getAccount() , accountMoney , targetAccount , TransactionType.WITHDRAWMONEY ) ;//入账记录生成//String accountType1 = TransactionType.SAVEMONEY ;

boolean insertReult1 =userMapper.accountInInsert(user1.getUserName() , user1.getAccount() , accountMoney , user.getUserName() , TransactionType.SAVEMONEY ) ;if((insertReult == false) || (insertReult1 == false)){return "转账记录生成失败";

}return "转账成功!";

}

service实现中每一行代码都有详细的讲解,总的来说,就是要实现出账方账户余额相应减少,入账方账户余额相应增加,同时生成对应的转账记录。

3. mapper层实现:

//转出更新

public booleanupdateAccountOut (Double accountMoney , String userName) ;//转入更新

public booleanupdateAccountIn (Double accountMoney , String userName) ;//转出记录插入

public booleanaccountOutInsert(String userName ,Double account , Double accountMoney , String targetAccount , String accountType) ;//转入记录插入

public boolean accountInInsert(String userName ,Double account , Double accountMoney , String targetAccount , String accountType) ;

update sys_user set account = (account - #{accountMoney}) where username = #{userName}

update sys_user set account = (account + #{accountMoney}) where username = #{userName}

insert into trasf_record

( username , old_account ,transaction_amount , new_account , target_account , account_type )

values

( #{userName} ,#{account} , #{accountMoney} , (#{account} - #{accountMoney}) , #{targetAccount} , #{accountType})

insert into trasf_record

(username , old_account ,transaction_amount , new_account , target_account , account_type )

values

(#{userName} ,#{account} , #{accountMoney} , (#{account} + #{accountMoney}) , #{targetAccount} , #{accountType})

4. postman前端模拟:

将上面生成的token塞到转账接口头信息中,访问数据库:

数据库信息刷新:

这样一来,转账功能也就实现了,在充分理解了转账功能后,入账出账功能就迎刃而解了。接下来继续实现账户入账和出账功能。

四、入账功能

1. controller层:

//存钱

@PostMapping("/saveMoney")public Result saveMoney (@RequestParam("accountMoney") Double accountMoney , HttpServletRequest request){returnResults.successWithData(userService.saveMoney(accountMoney , request) , BaseEnums.SUCCESS.code()) ;

}

2. service层:

service接口:

//存钱

public String saveMoney(Double accountMoney , HttpServletRequest request) ;

serviceImpl实现:

//存钱

publicString saveMoney(Double accountMoney , HttpServletRequest request){

Jedis jedis=jedisUtil.getSource() ;

String token= request.getHeader("token") ;

String userName=jedis.get(token) ;

User user=userMapper.selectByName(userName) ;//存入余额更新

boolean result =userMapper.updateAccountIn(accountMoney , userName) ;if(result = false){return "存入失败";

}//存入记录生成

boolean insertResult =userMapper.accountInInsert(userName ,user.getAccount() , accountMoney , userName , TransactionType.SAVEMONEY) ;if((insertResult == false)){return "入账记录生成失败";

}return "成功存入" + accountMoney + "元!";

}

3. mapper层和转账公用一套代码。

4. postman前端实现:

和转账一样,要记得将token塞进头信息中。

执行后结果如下:

数据库刷新结果如下:

五、出账功能

1. controller层:

//取钱

@PostMapping("withdrawMoney")public Result withdrawMoney (@RequestParam("accountMoney") Double accountMoney , HttpServletRequest request){returnResults.successWithData(userService.withdrawMoney(accountMoney , request) , BaseEnums.SUCCESS.code()) ;

}

2. service层:

service接口:

//取钱

public String withdrawMoney(Double accountMoney , HttpServletRequest request) ;

serviceImpl具体实现:

//取钱

publicString withdrawMoney(Double accountMoney , HttpServletRequest request){

Jedis jedis=jedisUtil.getSource() ;

String token= request.getHeader("token") ;

String userName=jedis.get(token) ;

User user=userMapper.selectByName(userName) ;double nowAccountMoney =user.getAccount() ;if(accountMoney >nowAccountMoney){return "余额不足";

}boolean result =userMapper.updateAccountOut(accountMoney , userName) ;if(result = false){return "取钱失败";

}//出账记录生成

boolean insertResult =userMapper.accountOutInsert(userName ,user.getAccount() , accountMoney , userName , TransactionType.WITHDRAWMONEY) ;if((insertResult == false)){return "出账记录生成失败";

}return "成功取出" + accountMoney + "元!";

}

3. mapper层和转账公用一套代码。

4. postman前端实现:

和转账一样,要记得将token塞进头信息中。

这样一来,出账功能也就实现了。

待解决问题:

1. redis暂未实现redis缓存对象,因此每次访问redis只是为了拿到token和对应的value,并未真正的利用到redis,因此,后期要将对象完整的存入到redis中,便于后期数据的获取。

2. 这里的转账记录表还可以做成索引表,每个用户单列一张表出来,更加的浅显易懂,但是任务量过大,需商榷后再决定是否将整表分开。

至此,结束。

java怎么模拟查询账户余额_spring boot + mybatis 模拟银行系统余额查询、转账、存取钱功能实现...相关推荐

  1. java批量上传文件_Spring boot 实现单个或批量文件上传功能

    一:添加依赖: org.springframework.boot spring-boot-starter-thymeleaf javax.servlet jstl org.apache.tomcat. ...

  2. java公交线路查询系统计算机毕业设计MyBatis+系统+LW文档+源码+调试部署

    java公交线路查询系统计算机毕业设计MyBatis+系统+LW文档+源码+调试部署 java公交线路查询系统计算机毕业设计MyBatis+系统+LW文档+源码+调试部署 本源码技术栈: 项目架构:B ...

  3. hikari如何切换数据源_spring boot+mybatis 多数据源切换(实例讲解)

    由于公司业务划分了多个数据库,开发一个项目会同事调用多个库,经过学习我们采用了注解+aop的方式实现的 1.首先定义一个注解类 @Retention(RetentionPolicy.RUNTIME) ...

  4. java的定时器不能提供实时保证_Spring Boot 2 整合 QuartJob 实现定时器实时管理功能...

    一.QuartJob简介 1.一句话描述 Quartz是一个完全由java编写的开源作业调度框架,形式简易,功能强大. 2.核心API (1).Scheduler 代表一个 Quartz 的独立运行容 ...

  5. pom添加mysql依赖tomcat崩溃_Spring Boot + Mybatis + Spring MVC环境配置(一) :Spring Boot初始化,依赖添加...

    最近在搭建一个Spring Boot + Mybatis + Spring MVC的环境,折腾来折腾去,两三天才搞定,记录下大概过程和遇到的错误 看一下Spring Boot官方的介绍 : Sprin ...

  6. vue表单中批量导入功能_spring boot mybatis+ vue 使用POI实现从Excel中批量导入数据

    一.前端vue+element 1.前端使用element的upload组件来实现文件的上传 style="display: inline-flex;margin-right: 8px&qu ...

  7. java 分页_Spring Boot + MyBatis 如何借助PageHelper插件实现分页效果

    概述 上文中已经介绍了Spring和MyBatis的整合,在上文的基础上我们加入了PageHelper这个插件,来实现MyBatis列表查询的分页效果 PageHelper是啥 PageHelper是 ...

  8. druid 多数据源_Spring Boot + Mybatis 中 配置Druid多数据源并实现自由切换

    概述 前面我们已经介绍过了对MyBatis.Druid的整合,接下来我们在之前的基础上做扩展,实现对Druid多数据源的配置以及动态切换数据源. 问题:多数据源使用场景有哪些呢? 回答:在业务发展中, ...

  9. Java Web现代化开发:Spring Boot + Mybatis + Redis二级缓存

    背景 Spring-Boot因其提供了各种开箱即用的插件,使得它成为了当今最为主流的Java Web开发框架之一.Mybatis是一个十分轻量好用的ORM框架.Redis是当今十分主流的分布式key- ...

  10. java restful接口开发实例_Spring Boot 中 10 行代码构建 RESTful 风格应用!

    点击上方"Java后端技术",选择"置顶或者星标" 你关注的就是我关心的! 作者:江南一点雨 微信公众号:牧码小子(ID:a_javaboy) 推荐阅读:10个 ...

最新文章

  1. 小tips:善用页面的base类
  2. windows下linux下socket编程区别
  3. java Random类和Math.Rondom
  4. eclipse adt如何切换到设计界面_如何将你的UI界面设计的更精致?不仅仅是运用对比,还要注意细节 | 分享...
  5. 安装loadrunner,缺少VC2005_sp1_with_atl的错
  6. 思科交换机配置试题_思科交换机配置命令(都是咱学过的总结)
  7. 前端JS/TS面试题
  8. 守法公民 Law Abiding Citizen (2009)
  9. 站群服务器金手指排名稳定,黑帽seo手法使用金手指:黑帽SEO,常见的SEO作弊手...
  10. 磁盘操作系统(DOS)
  11. 嵌入式开发学习笔记9-做一个好玩的LED闪烁
  12. c++-派生类型与常量
  13. lightroom 闪退_最近Autodesk软件全部闪退的解决办法
  14. DerekJiang的装修日记汇总帖
  15. Mybatis多表操作
  16. 图像处理(六)滤波降噪
  17. 用计算机来模拟二维生命,用并行计算机模拟二维氢团簇的光电离
  18. 北京儿童python培训
  19. 为什么培训机构有的老师不去考公务员?
  20. 获取微信公众号信息接口

热门文章

  1. 电子游戏发展史话——《doom启示录》读后感(三)
  2. iphone根目录索引大全
  3. 无法创建java虚拟机_java虚拟机创建失败的原因整理
  4. 通讯录(结尾附全部代码)
  5. 2003系统如何搭建ftp服务器配置,WINDOWSSERVER2003系统架设FTP服务器配置方法.pdf
  6. 你不得不读的书籍清单
  7. 模式识别算法:SVM支持向量机
  8. 安卓模拟器怎么切换IP地址
  9. 安卓手机端抓包获取直播源下载并使用PotPlayer播放
  10. un-app网易云歌词滚动功能