Java模拟银行转账(操作事务)_xyphf_和派孔明的博客-程序员宅基地_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

智能推荐

origin 作图时 下面出现一条Y=0直线怎么去掉_qq_16568205的博客-程序员宅基地_origin图下面有一条线

双击x轴或者那条Y=0的线,弹出的对话框中选Grid Lines,然后在右下角的additional line 那里把Y=0前面的勾去掉。bib参考文献题目中大写自动变为小写,即如何保持原大写问题: 加 {}括住内容。...

华为服务器机柜型号,华为服务器机柜 华为配电柜 华为600*800*2200_小可爱1号嘻嘻的博客-程序员宅基地

系统部件名称描述数量监控框当配电柜有故障发生时,可发出声光告警,并明确指示告警的分路1配电框1PowerSupply(-48V1)1~5路为100A输出:6~10路为63A输出1配电框2PowerSupply(-48V2)-11~15路为100A输出;16~20路为63A输出1配电框3PowerSupply(-48V1)21~25路为100A输出;26~30路为63A输出1配电框4PowerSup...

华为什么时候更新鸿蒙os,华为鸿蒙系统升级时间表_左钧来的博客-程序员宅基地

华为鸿蒙系统升级时间表6月2日HUAWEI Mate 40 ProHUAWEI P40 Pro+HUAWEI Mate 40 Pro+HUAWEI Mate 30 ProHUAWEI Mate 40 RS保时捷设计HUAWEI Mate 30 Pro 5GHUAWEI Mate 40HUAWEI Mate 30E Pro 5GHUAWEI Mate 40EHUAWEI Mate 30 RS保时捷设...

c++中set用法详解_Baiyi_destroyer的博客-程序员宅基地_set函数c++

1.关于setC++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构操作。vector封装数组,list封装了链表,map和set封装了二叉树等,在封装这些数据结构的时候,STL按照程序员的使用习惯,以成员函数方式提供的常用操作,如:插入、排序、删除、查找等。让用户...

【论文阅读】Weakly Supervised Data Augmentation Network for Fine-Grained Visual Classification_干饭的程序猿的博客-程序员宅基地

【论文阅读】Weakly Supervised Data Augmentation Network for Fine-Grained Visual Classification摘要具体实现弱监督注意学习空间表示法双线性池化摘要Data augmentation is usually adopted to increase the amount of training data, prevent overfitting and improve the performance of deep models.

kafka_2.11-2.0.0集群安装_给自己加加油的博客-程序员宅基地

首先安装zookeeper,参考:https://blog.csdn.net/codingToMaster/article/details/103551807kafka安装:下载kafka包:解压:tar -zxvf kafka_2.11-0.9.0.0.tgz命名为kafka:mv kafka_2.11-0.9.0.0/ kafka修改:server.propertiescd kafka/config/viserver.properties然后将kafka复制.

随便推点

linux bash 取得命令执行的结果,Linux的Bash特性之:命令的执行结果以及状态结果..._寻书人的博客-程序员宅基地

linux中的命令执行的状态结果:bash通过状态返回值来输出此结果:成功:0失败:1-255命令执行完成之后,其状态返回值保存于bash的特殊变量$?中;命令正常执行时,有命令的返回值:根据命令及其功能不同,结果各不相同;引用命令的执行结果(命令结果):$(COMMAND)或COMMAND (反引号)例如: ll /tmp/ 命令运行后返回的结果为命令的执行结果,命令执行成功后的状态结果返回在特...

Postgresql学习笔记之——数据类型之数值类型(整数、小数、浮点数、序列、货币)_Major_ZYH的博客-程序员宅基地_postgresql 小数类型

Postgresql数据库的数值类型包含了整数类型、小数类型、浮点数类型、序列类型、货币类型。

【leyou笔记】使用vue-cli工具_NeedCompanion的博客-程序员宅基地

使用vue-cli工具安装vue-cli$ npm install -g vue-cli2.在项目中创建model,vue-cli-demo进入到vue-cli-demo中进行初始化$ vue init webpack运行$ npm run dev

渣打银行妙用区块链技术重构贸易金…_qq53016353的博客-程序员宅基地

随着大型银行针对区块链技术“正能量”意义的讨论“尘埃落定”,“这项技术理应被运用”的共识在各大机构中“显山露水”。目前,国际贸易是频繁使用该技术的领域之一。已有机构表达针对供应链相关领域使用该技术的意愿,希望借此确保实体商品的安全保管以及贸易融资(银行的业务之一,是指银行对进口商或出口商提供的与进出口贸易结算相关的短期融资或信用便利)。其中较为频繁的用例是国际贸易。有意向向供应链相关领域

Java的多态性_乌克兰拖拉机的博客-程序员宅基地_java多态性

Java的多态性在java中,多态的核心表现在以下两点:·方法的多态性:方法的重载(overload):发生在同一类中,方法名称相同,参数个数、类型不相同。没有权限要求。即同一个方法名称可以根据参数类型或个数不同调用不同的方法体。方法的覆写(override):发生在有继承关心的类之间,方法名称、参数个数、类型全相同。子类的方法权限>=父类方法权限。同一个父类方法,可以根据实例化子类...

Android开发秘籍学习笔记(一)_cuihaoren01的博客-程序员宅基地

该目录为Android的一些学习笔记。Android四大组件之—-Activity   Android中有4大组件,它们分别是Activity、Service、BroadcastReceiver、ContentProvide。它们的功能如下表:  要学Activity首先肯定要了解Activity的生命周期,首先我们看Android官方API的介绍:   先来了解下,Activity中重要

推荐文章

热门文章

相关标签