基于Javaweb实现ATM机系统开发实战(十一)存储交易记录

首先创建一个业务接口:

package com.atm.service;

import com.atm.pojo.RunMessage;

//交易记录的业务接口
public interface RunMessageService{
    //添加交易记录
    public void addRunMessage(RunMessage runMessage) throws Exception ;
}

再完成业务接口的实现类:

package com.atm.service.impl;

import com.atm.dao.RunMessageDao;
import com.atm.pojo.RunMessage;
import com.atm.service.RunMessageService;


//交易记录业务接口实现类
public class RunMessageServiceImpl implements RunMessageService   {

    private RunMessageDao runMessageDao=new RunMessageDao();



    @Override
    public void addRunMessage(RunMessage runMessage)  throws Exception  {
        runMessageDao.insert(runMessage);
    }
}

在创建数据层的持久化类:

package com.atm.dao;


import com.atm.pojo.RunMessage;
import com.atm.utill.DBUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;

//交易记录持久化类
public class RunMessageDao {
    //保存交易记录
    public void insert(RunMessage runMessage) throws Exception {
        Connection conn= DBUtils.getConnection();
        PreparedStatement preparedStatement = conn.prepareStatement("insert  into runmessage values (null,?,?,?,?,?) ");
        preparedStatement.setString(1,runMessage.getIcno());
        preparedStatement.setString(2,runMessage.getRm_date());
        preparedStatement.setString(3,runMessage.getRm_currency());
        preparedStatement.setDouble(4,runMessage.getRm_balance());
        preparedStatement.setDouble(5,runMessage.getRm_rest());
        preparedStatement.executeUpdate();
        DBUtils.release(conn,preparedStatement,null);
    }
}

在存款中调用接口来保存交易记录:

package com.atm.servlet;

import com.atm.pojo.RunMessage;
import com.atm.pojo.User;
import com.atm.service.RunMessageService;
import com.atm.service.UserService;
import com.atm.service.impl.RunMessageServiceImpl;
import com.atm.service.impl.UserServiceImpl;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

//用户存款
@WebServlet("/UserStore")
public class UserStoreServlet extends HttpServlet {
    private UserService userService=new UserServiceImpl();
    private RunMessageService runMessageService=new RunMessageServiceImpl();
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    User user=(User) request.getSession().getAttribute("ua");
    int money=Integer.parseInt(request.getParameter("saveNum"));
    if(money ==0){
        request.getSession().setAttribute("error3","存款金额不能为0");
        response.sendRedirect("changepage/UserStore.jsp");
    } else if (money%100!=0) {
        request.getSession().setAttribute("error3","存款金额必须为100的倍数");
        response.sendRedirect("changepage/UserStore.jsp");
    } else if (money>10000) {
        request.getSession().setAttribute("error3","存款金额不能大于10000");
        response.sendRedirect("changepage/UserStore.jsp");
    }else {
        try{
            userService.storeMoney(money,user.getIcno());
            //保存交易记录
            SimpleDateFormat sdf=new SimpleDateFormat("YYYY-MM-dd hh:mm:ss");
            //查询当前最新的账户余额
            double rest= userService.getBalance(user.getIcno());
            RunMessage runMessage =new RunMessage();
            runMessage.setIcno(user.getIcno());
            runMessage.setRm_currency("人民币");
            runMessage.setRm_date(sdf.format(new Date()));
            runMessage.setRm_balance(Double.valueOf(money));
            runMessage.setRm_rest(rest);
            //保存交易记录
            runMessageService.addRunMessage(runMessage);
            response.sendRedirect("/UserSerch");
        }catch (Exception e){
            request.getSession().setAttribute("error3","存款失败");
            response.sendRedirect("changepage/UserStore.jsp");
            e.printStackTrace();
        }

    }
    }
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doPost(request,response);
    }

}

取款中也是一样的:

package com.atm.servlet;

import com.atm.pojo.RunMessage;
import com.atm.pojo.User;
import com.atm.service.RunMessageService;
import com.atm.service.UserService;
import com.atm.service.impl.RunMessageServiceImpl;
import com.atm.service.impl.UserServiceImpl;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;


//模拟用户取款
@WebServlet("/UserFetch")
public class UserFetchServlet extends HttpServlet {
    private RunMessageService runMessageService=new RunMessageServiceImpl();
    private UserService userService=new UserServiceImpl();
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //拿到当前用户信息
        User user = (User) request.getSession().getAttribute("ua");
        //查询余额:
        double balance = 0;
        try {
            balance = userService.getBalance(user.getIcno());
        } catch (Exception e) {
            e.printStackTrace();
        }
        //获得当前存款参数
        int money = Integer.parseInt(request.getParameter("fetchNum"));
        if (money == 0) {
            request.getSession().setAttribute("error2", "取款金额不能为0");
            response.sendRedirect("changepage/UserFetch.jsp");
        } else if (money % 100 != 0) {
            request.getSession().setAttribute("error2", "取款金额必须为100的倍数");
            response.sendRedirect("changepage/UserFetch.jsp");
        } else if (money > 10000) {
            request.getSession().setAttribute("error2", "单次取款金额不能大于10000");
            response.sendRedirect("changepage/UserFetch.jsp");
        } else if (money > balance) {
            request.getSession().setAttribute("error2", "余额不足");
            response.sendRedirect("changepage/UserFetch.jsp");
        } else {
            try {
                userService.fetchMoney(money, user.getIcno());
                //保存交易记录
                SimpleDateFormat sdf=new SimpleDateFormat("YYYY-MM-dd hh:mm:ss");
                //查询当前最新的账户余额
                double rest= userService.getBalance(user.getIcno());
                RunMessage runMessage =new RunMessage();
                runMessage.setIcno(user.getIcno());
                runMessage.setRm_currency("人民币");
                runMessage.setRm_date(sdf.format(new Date()));
                runMessage.setRm_balance(-Double.valueOf(money));
                runMessage.setRm_rest(rest);
                //保存交易记录
                runMessageService.addRunMessage(runMessage);

                response.sendRedirect("/UserSerch");
            } catch (Exception e) {
                request.getSession().setAttribute("error2", "取款失败");
                response.sendRedirect("changepage/UserFetch.jsp");
                e.printStackTrace();
            }

        }
    }
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doPost(request,response);
    }
}

然后我们重启一下系统,存个钱测试一下;

发现交易记录已经成功保存啦~

 代码已上传~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JAVA中的Socket编程、通信协议、传输协议

JAVA中的Socket编程 一、Socket概述 Socket,建立起客户端和服务器之间的连接,实现数据的传输和交互,它既可以发送请求,也可以接受请求,一个Socket由一个IP地址和一个端口号唯一确定,利用Socket能比较方便的…

基于单片机指纹考勤系统的设计与实现

功能介绍 以51单片机作为主控系统;利用指纹采集模块存储打卡信息;12864显示当前考勤信息,时间 ;如果迟到 语音播报 您已迟到;按键进行注册指纹、删除指纹、设置当前时间和签到时间、查询打卡等;具有掉电保存…

讯为RK3568开发板到手编译buildroot系统入坑一

从事单片机开发多年一直想买一个开发板学习Linux系统,这次狠心花了800多打样买了一个讯为的RK3568低配。裸板配置。 因为讯为没有编译系统的视频教程,只有文档的教程,而且只有瑞芯微官方带的Linux源码中的系统编译后文档教程。像ubuntu是没有…

51单片机的智能交通控制系统【含仿真+程序+演示视频带原理讲解】

51单片机的智能交通控制系统【含仿真程序演示视频带原理讲解】 1、系统概述2、核心功能3、仿真运行及功能演示4、程序代码 1、系统概述 该系统由AT89C51单片机、LED灯组、数码管组成。通过Protues对十字路口红绿灯控制逻辑进行了仿真。 每个路口包含了左转、右转、直行三条车道…

使用FreeMarker自定义生成word文档

使用FreeMarker自定义生成word文档 最终生成word文档如下: 实现思路: 按照要生成的文档模板格式,创建一个新的word(doc)文档,将其调整成所需格式,然后处理其中需要动态填充的数据&#xff0…

【Ubuntu】Ubuntu14 安装 open-jdk-1.7(open-jdk-7) 最新 持续更新中

【Ubuntu】Ubuntu14 安装 open-jdk-1.7(open-jdk-7) 最新 持续更新中 一、概述二、特别说明三、开发环境四、安装 open-jdk-1.7五、配置环境1、配置环境变量路径2、环境变量3、完成安装 一、概述 一个好的文章能够帮助开发者完成更便捷、更快速的开发。…

红帽Linux 8.0末班车

RH124、RH134、RH294三门课和考前辅导的套包课程。红帽系统管理是针对了解 Linux 并需要核心红帽企业 Linux 技能的 IT 业人员而设计的。学完这个课程后,学员将能够执行安装操作,建立网络连接,管理物理存储器&#xff0c…

Linux vs MacOS ,你更喜欢哪个系统?

大家应该都知道Windows,Linux和MacOS这几个操作系统,它们各有优缺点,比如像游戏等专门的领域,Windows当然是比Linux更好些,但Linux是开源的,安全性和稳定性要比Windows要好,如果是关于视频编辑方…

什么企业适合建设数据中台?

从历史脉络中,看到数据中台凸显价值,数据中台是大数据下一站。所有企业都适合建设数据中台吗?什么样应该建数据中台? 2018年我们在建数据中台前面临的窘境,通过了解我们建数据中台的背景,你也可以对照着看…

CTFShow-WEB入门篇文件上传详细Wp(151-170)

WEB入门篇--命令执行详细Wp 文件上传:Web151:Web152:Web153:Web154:Web155:Web156:Web157:Web158:Web159:Web160:Web161:Web162&#…

基于JAVA SpringBoot和Vue UniApp外卖订餐小程序

随着社会的发展和进步,网络信息技术的迅速发展已经渗透到我们生活的各个角落,传统餐饮业也受到了很大的影响,大部分传统中餐馆都开门,最多只能通过一个电话预约。但是在中国春节长假期间,餐厅不能接待这么多顾客。因此…

学习react,复制一个civitai(C站)-更新3

更新内容 优化了一下加载速度 图片列表 初步更新了199张图片,大部分都有stable diffusion 的prompts。 可以直接复制到AI绘画里面使用。 先来看看效果图吧: 我还是挺喜欢这种砌砖流布局 技术点 同样使用了砌墙瀑布流布局:masonry js 安装方法 npm …

15 - 信号处理设计模式

---- 整理自狄泰软件唐佐林老师课程 查看所有文章链接:(更新中)Linux系统编程训练营 - 目录 文章目录 1. Linux应用程序安全性讨论1.1 问题1.2 不同场景1.2.1 场景一:不需要处理信号1.2.2 场景二:需要处理信号 2. 场景…

matlab将0 1矩阵显示为黑白图像

解决方法 clear clc pattern cell2mat(struct2cell(load("pattern"))); pic1 squeeze(pattern(1:64,:,:,:)); pic1 logical(permute(pic1, [2,3,1])); temp pic1(:,:,1); imshow(pic1(:,:,1));显示效果 test int8(rand(30,30)); imshow(logical(test));本来想…

初识mysql数据库之索引概念与磁盘效率问题

目录 一、索引的概念及作用 二、实际看看索引的效率提升 三、认识磁盘 1. 简单了解磁盘 2. 数据库文件存储位置 3. 定位扇区 4. 数据读取效率问题 5. 磁盘随机访问与磁盘连续访问 5.1 随机访问 5.2 连续访问 四、mysql与磁盘的交互 五、建立共识 一、索引的概念及…

Flask_使用flask_marshmallow序列化数据

代码如下: from flask import Flask from flask_marshmallow import Marshmallow from flask_sqlalchemy import SQLAlchemy from marshmallow import fieldsapp Flask(__name__) app.config["SQLALCHEMY_DATABASE_URI"] "mysqlpymysql://root:12…

excel常用操作备忘

excel操作: 1、快速填充多列公式:选中多列后,按ctrlD填 充。 2、快速删除空行:全选行,按ctrlG,空值项前边打上钩,点确定,针对选中的空行,鼠标右击,点删除&…

消息推送(websocket)集群化解决方案

目录 需求分析解决方案实现步骤架构图配置websocket请求地址配置websocket连接前置和连接关闭监听配置websocket处理程序配置redis交换机配置redis订阅监听配置redis发布监听需求分析 及时信息传递:消息推送功能能够确保网站向用户发送及时的重要信息,包括新闻更新、促销活动…

漏洞复现畅捷通CRM SQL注入

免责声明 术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律,遵守公共秩序,尊重社会公德,不得利用网络从事危害国家安全、荣誉和利益,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失,均由使用…

网络安全专业必考的三个证书,初学者建议收藏!

学习网络安全,有三个必考证书,最后一个人手一本! 一,NISP证书 NISP即国家信息安全水平考试,由中国信息安全测评中心发证,属于网络安全专业的必考证书。 只有考取NISP一级证书才有机会考取二级&#xff0…