Java模拟银行转账(操作事务)

技术标签: JAVA  Oracle  JAVA的那些事儿  

第一步:建立一张银行账户表 叫 BankAccount 并建立一个序列

id         number    pk         //用户id
ano        varchar2(30)  uk     //用户卡号
apassword  varchar2(30)         //用户密码
aname      varchar2(30)         //用户名
amoney     number               //余额

//创建银行用户表
drop table bank_account;
create table    bank_account(
     id    number  constraint   bank_account_id_pk   primary key,
     ano  varchar(30) constraint bank_account_ano_uk  unique,
     apassword  varchar(30), 
     aname   varchar(30),
     amoney  number
);
drop sequence bank_account_id_seq;
create sequence    bank_account_id_seq;
6.2 写一个java程序  用来开户   只要输入 账号                  密码     开户人的姓名   余额 
开户信息如下                           6225880111887788     123456   zhangsan       99999999  
                                      6225880111887799     123456   lisi    9  

第二步:创建Bean包,编写实体类

public class BankAccount {
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getAno() {
        return ano;
    }
    public void setAno(String ano) {
        this.ano = ano;
    }
    public String getAname() {
        return aname;
    }
    public void setAname(String aname) {
        this.aname = aname;
    }
    public String getApassword() {
        return apassword;
    }
    public void setApassword(String apassword) {
        this.apassword = apassword;
    }
    public String getAmoney() {
        return amoney;
    }
    public void setAmoney(String amoney) {
        this.amoney = amoney;
    }
    @Override
    public String toString() {
        return "BankAccount [id=" + id + ", ano=" + ano + ", aname=" + aname + ", apassword=" + apassword + ", amoney="
                + amoney + "]";
    }
    public BankAccount(String ano, String aname, String apassword, String amoney) {
        super();
        this.ano = ano;
        this.aname = aname;
        this.apassword = apassword;
        this.amoney = amoney;
    }
    public BankAccount(int id, String ano, String aname, String apassword, String amoney) {
        super();
        this.id = id;
        this.ano = ano;
        this.aname = aname;
        this.apassword = apassword;
        this.amoney = amoney;
    }
    public BankAccount() {
        super();
        // TODO Auto-generated constructor stub
    }
    private int id;
    private String ano;
    private String aname;
    private String apassword;
    private String amoney;
}

第三步:创建账号,编写开户程序

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;
import com.xdl.util.JdbcUtil2;

public class CreateBankAccount {
    public static void main(String[] args) {
         Scanner  sc = new Scanner(System.in);
         System.out.println("请输入开户的卡号:");
         String  ano = sc.nextLine();
         System.out.println("请输入开户的名字:");
         String  aname = sc.nextLine();
         System.out.println("请输入开户的密码:");
         String  apassword = sc.nextLine();
         System.out.println("请输入开户的钱数:");
         String  smoney = sc.nextLine();
         //double  amoney = Double.parseDouble(smoney);
         // 把输入的数据 包装成对象  
         BankAccount  ba = new BankAccount(ano, aname, apassword, smoney);
         Connection  conn = null;
         PreparedStatement  ps = null;
         conn = JdbcUtil2.getConnection();
         String  sql="insert into bank_account values(bank_account_id_seq.nextval,?,?,?,?)";
         try {
            ps = conn.prepareStatement(sql);
            ps.setString(1, ba.getAno());
            ps.setString(2, ba.getApassword());
            ps.setString(3, ba.getAname());
            ps.setDouble(4, Double.parseDouble(ba.getAmoney()));
            int rows = ps.executeUpdate();
            if(rows == 1) {
                System.out.println("开户成功");
            }else{
                System.out.println("开户失败");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            JdbcUtil2.releaseResource(conn, ps, null);
        }
    }
}

第四步:编写转账程序

1、先登录,登录成功才可以执行转账程序

2、转账逻辑时,链接会自动进行数据的提交,这样万一转入的账户不成功,则无法回退之前的操作,为了解决 操作语句 需要同时成功或同事失败 则需要关闭连接的自动提交

禁止自动提交 conn.setAutoCommit(false);
语句都成功 就提交 conn.commit() ;否则进行回滚 conn.rollback();

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;
import com.xdl.util.JdbcUtil2;

public class BankAccountTransfer {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入登录的卡号:");
        String  ano  = sc.nextLine();
        System.out.println("请输入登录的密码:");
        String  apassword = sc.nextLine();
        Connection  conn = null;
        PreparedStatement ps = null;
        /* 定义两个转账的  PreparedStatement */
        PreparedStatement from = null;
        PreparedStatement to = null;
        ResultSet  rs = null;
        BankAccount  ba = null;
        conn = JdbcUtil2.getConnection();
        String  sql="select * from bank_account where ano=? and apassword=?";
        try {
            ps=conn.prepareStatement(sql);
            ps.setString(1, ano);
            ps.setString(2, apassword);
            rs = ps.executeQuery();
            if(rs.next()){
                ba = new BankAccount(rs.getInt("id"),
                   rs.getString("ano"), rs.getString("aname"), rs.getString("apassword"),
                   rs.getString("amoney"));
            }
            if(ba!=null){
                System.out.println("登录成功");
                // 从当前账户中扣除输入的金额
                System.out.println("请输入转账的金额:");
                String  smoney=sc.nextLine();
                double  money = Double.parseDouble(smoney);
                sql="update  bank_account set amoney=amoney-? where ano=?";
                // 禁止自动提交  
                conn.setAutoCommit(false);
                from = conn.prepareStatement(sql);
                from.setDouble(1, money);
                from.setString(2, ba.getAno());
                int  fromf=from.executeUpdate();
                // 提示用户输入转入的账号  和  账户名
                System.out.println("请输入收款的账号:");
                String  toano = sc.nextLine();
                System.out.println("请输入收款人姓名:");
                String  toaname= sc.nextLine();
                sql="update  bank_account set amoney=amoney+? where ano=? and aname=?";
                to=conn.prepareStatement(sql);
                to.setDouble(1, money);
                to.setString(2, toano);
                to.setString(3, toaname);
                int tof = to.executeUpdate();
                if(fromf==1 && tof==1){
                    System.out.println("转账成功");
                    conn.commit(); //提交
                }else{
                    System.out.println("转账失败");
                    conn.rollback(); //回滚
                }
            }else{
                System.out.println("登录失败");
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            try {
                conn.rollback();
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
            e.printStackTrace();
        }finally{
            JdbcUtil2.releaseResource(conn, ps, rs);
            JdbcUtil2.releaseResource(conn, from, null);
            JdbcUtil2.releaseResource(conn, to, null);
        }
    }
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xyphf/article/details/79394874

智能推荐

小学计算机教室管理员工作总结,多媒体教室管理员工作总结范文三篇_FFFire小火的博客-程序员宅基地

多媒体教室管理员工作总结范文三篇篇一:多媒体教室管理工作总结在这过去的一学期,我一直严格要求自己,努力工作,刻苦学习,兢兢业业,较好地完成了领导交给的工作任务,在工作中取得了一定的成绩,受到领导、同事和学生的一致认可和好评。回顾过去,工作总结如下:一、努力学习,不断提高自己的政治思想素质。本人热爱党的教育事业,热爱本职工作,加强自我修养,热爱学生,真诚对待学生,受到学生的好评。特别是在此期间,我努...

pytorch经过gpu训练的模型的结果使用_MAR-Sky的博客-程序员宅基地_pytorch训练结果

一个模型结果形式如下,提取出来第一种方式pre_re = mymodel(x)pre_re : tensor([ 预测值的结果 ],device='cuda:0,' ,grad_fn=<AddmBackward>)#######################想要使用预测结果的内容#1.需要将输入预测进行detach(),因为tensor数据是一个整体对象pre_re.detach()的结果仍然时Tensor类型,若想使用需要使用numpy()detach后,pre_re : te

树莓派4b 烧录64位ubuntu_树莓派4B安装64位桌面版ubuntu20_CeLaMbDa的博客-程序员宅基地

[准备]硬件: 电脑、树莓派4B、显示器(hdmi线Micro HDMI转标准HDMI)、鼠标、键盘、读卡器、TF卡、网线[安装]1. 将读卡器插入电脑usb口;2. 打开Raspberry PI Imager,点击CHOOSE OS,选择Use custom导入ubuntu20镜像(解压好的 .img文件)3. 选择读卡器4. 点击WRITE,开始烧写系统,等待一段时间,软件提示烧写完毕。5. ...

Mysql安装步骤_德鲁克java的博客-程序员宅基地

安装步骤1、下载后得到zip压缩包.2、解压到自己想要安装到的目录,本人解压到的是D:\Environment\mysql-5.7.193、添加环境变量:我的电脑->属性->高级->环境变量选择PATH,在其后面添加: 你的mysql 安装文件下面的bin文件夹4、编辑 my.ini 文件 ,注意替换路径位置[mysqld]basedir=D:\Program Files\mysql-5.7\datadir=D:\Program Files\mysql-5.7\data\

【机器学习】线性回归常用的几种衡量指标_zbchenchanghao的博客-程序员宅基地

一、MSE(Mean Squared Error)名称:均方误差公式:二、RMSE(Root Mean Squared Error)名称:均方根误差公式:三、MAE(Mean Absolute Error)名称:平均绝对值误差公式:注:上述衡量指标的局限:同一个模型,解决不同问题,因为数量量级可能不同,所以最终的结果无法横向对比,如果将最终的结果映射到[0,1]区间内,这样就可以横向比较哪个模型能更好的解决此问题,故R Squared即可满足要求。四、R ..

Openvswitch原理与代码分析(5): 内核中的流表flow table操作_weixin_30845171的博客-程序员宅基地

当一个数据包到达网卡的时候,首先要经过内核Openvswitch.ko,流表Flow Table在内核中有一份,通过key查找内核中的flow table,即可以得到action,然后执行action之后,直接发送这个包,只有在内核无法查找到流表项的时候,才会到用户态查找用户态的流表。仅仅查找内核中flow table的情况被称为fast pa...

随便推点

android 开发闪屏动画,Android闪屏效果实现方法_袁浩瀚的博客-程序员宅基地

本文实例讲述了Android闪屏效果实现方法。分享给大家供大家参考,具体如下:闪屏,就是SplashScreen,也可以说是启动画面,就是启动的时候,闪(展示)一下,持续数秒后,自动关闭。android的实现非常简单,使用Handler对象的postDelayed方法就可以实现。在这个方法里传递一个Runnable对象和一个延迟的时间。该方法实现了一个延迟执行的效果,延迟的时间由第2个参数指定,单...

Webpack5学习—ESlint_Wscthhh的博客-程序员宅基地

ESLintESLint是一个静态代码分析工具(Static program analysis,可以在没有任何程序执行的情况下,对代码进行分析)ESLint可以帮助我们在项目中建立统一的团队代码规范,保持正确、统一的代码风格,提高代码的可读性、可维护 性ESLint的规则是可配置的,我们可以自定义属于自己的规则ESLint在分析的时候,是依赖JS编译器的,通过JS编辑器,ESLint将我们编写的代码进行词法分析和语法分析生成对应的AST树,ESLint通过遍历AST树对代码进行合法性校验

【乱七八糟】国内天气预报查询测试_weixin_34404393的博客-程序员宅基地

为什么80%的码农都做不了架构师?>>> ...

vc++实例_Miss Cake的博客-程序员宅基地_vc++实例

试验一 对话框、按扭及编辑框控件一、目的和要求   掌握对话框编辑器的使用方法  熟悉对话框的编辑过程   掌握控件的创建和使用方法  掌握静态控件、按钮和编辑控件的使用方 二、上机准备   复习教材第四章关于对话框、静态控件、按钮和编辑框控件等内容   设计一个对话框,用于学生成绩的输入,要求能输入学生姓名、学号、性别以及3门课程成绩。在该对话框中要用到控件:

Windows的西班牙语输入法_炼丹的蜗牛@/"的博客-程序员宅基地

Windows的西班牙语输入法:一、带重音符号的小写元音字母字符按键á先按一下【’】键,然后按一下【A】键é先按一下【’】键,然后按一下【E】键í先按一下【’】键,然后按一下【I】键ó先按一下【’】键,然后按一下【O】键ú先按一下【’】键,然后按一下【U】键二、带重音符号的大写元音字母字符按键Á先按一下【’】键,然后按着【Shift】键,再按一下【A】键É先按一下【’】键,然后按着【Shift】键,再按一下【E

zigbee学习深入浅出第一讲_超级可爱的夹心小朋友的博客-程序员宅基地

1、什么是zigbee?它能干什么用?为什么引入zigbee?zigbee是无线设备之间的一种通信方式,类似于人与人之间用普通话交流,普通话就是一种通信方式。zigbee通信方式和zigbee协议说的是一回事。节点、无线模块、无线设备说的是一个东西。zigbee的作用构建无线局域网2.zigbee和无线传感器网络之间的关系?如果一个无线局域网用于传感器数据收集和监控,那么这个网路就叫无线传感器网络。无线传感器网络是无线局域网的一个具体应用。蓝牙:功耗低,组建网络节点数少7-8WIFI:通信速率

推荐文章

热门文章

相关标签