• 小任务:简单实现银行业务系统(附 ideal编辑器固定序列化版本方法)


    小任务:
    1.实现一个银行业务系统
    2.要求有如下的业务功能
    登录
    查询余额
    存款
    取款
    转账
    开户
    销户
    3.记录银行的用户信息
    账号–密码–余额 BufferedReader readLine ObjectOutputStream

    一、序列化版本

    • 1.1 什么是序列化?什么是反序列化?
    • 答:序列化是计算机内存中存储的信息,写入到磁盘的文件中。反序列化磁盘里文件中的信息,读入到计算机内存中。
    • 1.2 为什么要进行固定化序列化版本?
    • 答:内存中临时储存的信息与磁盘中存储的信息,常常需要读入和写出进行转换。如果运行的环境是在不同的java版本,或者其它不同环境下,可能会造成IO流传输转码解析错误。因此,需要用一个属性来对比,看前后信息的一致。如果属性值一样,说明是同一个运行环境,才能进行有效的读写信息。

    1.1 类:实现序列化接口

    在这里插入图片描述

    1.2 ideal编辑器设置:自动生成序列化

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    1.3 类:鼠标光标放类名上面可看到序列化版本提示:点击自动固定生成。

    在这里插入图片描述
    在这里插入图片描述

    二、银行系统

    在这里插入图片描述
    在这里插入图片描述

    package atmsystem;
    
    import java.io.Serializable;
    
    /**
     * @author liuxian
     */
    public class User implements Serializable {
    
        //建议除了私有属性  无参数有参数构造方法  属性对应的get、set方法
        //建议类实现一个序列化接口  添加一个序列化版本号
        private static final long serialVersionUID = 1406005760612010227L;
    
        //只是为了记录数据库中的一行信息  账号  密码  余额
        private String aname;
        private String apassword;
        private Float abalance;
    
        public User(String aname, String apassword, Float abalance) {
            this.aname = aname;
            this.apassword = apassword;
            this.abalance = abalance;
        }
    
        public User() {
        }
    
        public String getAname() {
            return aname;
        }
    
        public String getApassword() {
            return apassword;
        }
    
        public Float getAbalance() {
            return abalance;
        }
    
        public void setAname(String aname) {
            this.aname = aname;
        }
    
        public void setApassword(String apassword) {
            this.apassword = apassword;
        }
    
        public void setAbalance(Float abalance) {
            this.abalance = abalance;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    package atmsystem;
    
    import java.io.*;
    import java.util.HashMap;
    import java.util.Iterator;
    
    /**
     * @author liuxian
     */
    public class AtmService {
    
        //这一个类都是负责处理业务逻辑  需要底层数据的支持
        private AtmDao dao=new AtmDao();
        //网络银行的业务
        //所有的业务方法,按照我们之前的优化结构设计
        //只有业务逻辑  判断 比较  计算等等
        //看不见任何数据的操作  从哪儿查出来的  存在哪儿
        //设计一个业务方法  登录
        public String login(String aname,String apassword){
    
    //        try {
    //            //创建一个输入流  读取真实文件的记录
    //            File file=new File("src\\atmsystem\\User.txt");
    //            FileReader fileReader=new FileReader(file);
    //            BufferedReader bufferedReader=new BufferedReader(fileReader);
    //            String value = bufferedReader.readLine();//value表示一行人的所有信息
    //            while(value!=null){//柳先生-123-800
    //                String[] user = value.split("-");//user数组储存的是一个人的信息
    //                if (user[0].equals(aname)){
    //                    if (user[1].equals(apassword)){
    //                        return "登录成功";
    //                    }
    //                }
    //                value=bufferedReader.readLine();
    //            }
    //        } catch (IOException e) {
    //            e.printStackTrace();
    //        }
    
            User user=dao.selectOne(aname);
            if (user!=null&& user.getApassword().equals(apassword)){
                return "登录成功";
            }
            return "用户名或密码错误";
        }
    
        //设计一个业务的方法  查询余额
        public Float queryBalance(String aname){
            User user=dao.selectOne(aname);
            return user.getAbalance();
        }
    
        //设计一个业务方法  存款  数据中做修改   某一行记录
        public void deposit(String aname,Float depositMoney){
            //先将集合内的数据做修改  找到某一个user对象  对象中的balance属性修改
            User user=dao.selectOne(aname);
            user.setAbalance(user.getAbalance()+depositMoney);
            dao.update(user);
            //dao.commit();//提交  将临时的数据永久的写入文件  事务
        }
    
        //设计一个业务方法  取款
        public void withdrawal(String aname,Float withdrawalMoney){
            //先将集合内的数据做修改  找到某一个user对象  对象中的balance属性修改
            User user=dao.selectOne(aname);
            if (user.getAbalance()>withdrawalMoney){
                user.setAbalance(user.getAbalance()-withdrawalMoney);
                dao.update(user);
                //this.commit();//提交  将临时的数据永久的写入文件  事务
            }else {
                System.out.println("对不起"+aname+"您的账户余额不足");
            }
        }
    
        //设计一个业务方法  转账
        public void transfer(String outName,String inName,Float transferMoney){
            //先将集合内的数据做修改  找到某一个user对象  对象中的balance属性修改
            User outUser=dao.selectOne(outName);
            if (outUser.getAbalance()>transferMoney){
                User inUser = dao.selectOne(inName);
                if (inUser!=null){//转入账户是存在的
                    outUser.setAbalance(outUser.getAbalance()-transferMoney);
                    inUser.setAbalance(inUser.getAbalance()+transferMoney);
                    dao.update(outUser);
                    //this.update(inUser);
                    //this.commit();//提交  将临时的数据永久的写入文件  事务
                }else {
                    System.out.println("对不起,您输入的转入账户不存在");
                }
            }else {
                System.out.println("对不起"+outName+"您的账户余额不足");
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    package atmsystem;
    
    import java.io.*;
    import java.util.HashMap;
    import java.util.Iterator;
    
    /**
     * @author liuxian
     */
    public class AtmDao {
    
        //DAO作为一个层次---持久层  操作数据  读写数据
        //dao中还有一个小弟  负责加载文件  更新文件数据
        private FileLoaderAndCommit flac=new FileLoaderAndCommit("src\\atmsystem\\User.txt");
    
        //发现登陆的方法 每一次调用都需要创建流管道  读取文件的信息
        //内存中操作登陆的业务  文件不在一个地方  认为读取的过程很慢
        //想到一个解决方案  创建一个map集合充当缓存  将文件中的数据全都读出来 读一次
        //一行记录  创建一个对象存起来  一个人   一个对象  三个属性
        //集合除了可以充当缓存  增强执行性能以外  还能用来做记录的修改
        private HashMap<String,User> userBox=flac.loadFile();
    
    
        //设计一个方法 目的是为了我的所有业务服务
        //有参数  账号名  返回值  一个对象User
        public User selectOne(String aname){
            return userBox.get(aname);//这里是一行  以后如果不是一行的时候  只需要改变这个方法
        }
        //设计一个方法  目的是为了将某一个修改完毕的对象存入集合
        public void update(User user){
            userBox.put(user.getAname(), user);//集合做了修改
            flac.commit(userBox);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    package atmsystem;
    
    import java.io.*;
    import java.util.HashMap;
    import java.util.Iterator;
    
    /**
     * @author liuxian
     */
    public class FileLoaderAndCommit {
    
        private String fileName=null;
        public FileLoaderAndCommit(String fileName){
            this.fileName=fileName;
        }
    
        //程序块的目的在对象创建之前  给集合进行赋值操作
        public HashMap<String,User> loadFile(){
            HashMap<String,User> userBox=new HashMap<String, User>();
            FileReader fileReader=null;
            BufferedReader bufferedReader=null;
            try {
                //创建一个输入流  读取真实文件的记录
                File file=new File(fileName);
                fileReader=new FileReader(file);
                bufferedReader=new BufferedReader(fileReader);
                String value = bufferedReader.readLine();
                while (value!=null){
                    //value的信息拆分成三段  构建一个User对象   三个属性刚好存储  对象存入集合
                    String[] userValue = value.split("-");
                    User user=new User(userValue[0],userValue[1],Float.parseFloat(userValue[2]));
                    userBox.put(user.getAname(), user);//put(账号,User对象)
                    value=bufferedReader.readLine();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }finally {
                if (fileReader!=null){
                    try {
                        fileReader.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if (bufferedReader!=null){
                    try {
                        bufferedReader.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            return userBox;
    
        }
    
        //设计一个方法  目的是为了将集合内的所有数据写入文件
        public void commit(HashMap<String,User> userBox){//数据库--->commit提交--->事务
            FileWriter fileWriter=null;
            BufferedWriter bufferedWriter=null;
            try {
                //创建一个字符型文件输出流
                File file=new File(fileName);
                fileWriter=new FileWriter(file);
                bufferedWriter=new BufferedWriter(fileWriter);
                Iterator<String> names = userBox.keySet().iterator();
                while (names.hasNext()){
                    String name = names.next();//集合内获取的某一个人名
                    User user = userBox.get(name);//记录一个人的真实数据
                    //将user对象中的真实数据拼接成一行字符串
                    StringBuffer builder=new StringBuffer(user.getAname());
                    builder.append("-");
                    builder.append(user.getApassword());
                    builder.append("-");
                    builder.append(user.getAbalance());
                    //字符型文件输出流将拼接好的builder写入文件
                    bufferedWriter.write(builder.toString());
                    bufferedWriter.newLine();
                    bufferedWriter.flush();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }finally {
                if (fileWriter!=null){
                    try {
                        fileWriter.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if (bufferedWriter!=null){
                    try {
                        bufferedWriter.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
    
    
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    package atmsystem;
    
    import java.util.Scanner;
    
    /**
     * @author liuxian
     */
    public class TestMain {
        public static void main(String[] args) {
            AtmService service=new AtmService();
            Scanner input=new Scanner(System.in);
            System.out.println("欢迎您使用银行自助服务系统\n请输入账号:");
            String aname=input.nextLine();
            System.out.println("请输入密码");
            String apassword=input.nextLine();
            String loginResult = service.login(aname, apassword);
            System.out.println(loginResult);
            if (loginResult.equals("登录成功")){
                System.out.println("恭喜您登录成功,请你输入操作项");
                System.out.println("查询请输入1\n存款输入2\n取款请输入3\n转账请输入4\n退出请输入5\n如需帮助请拨打电话1234567890");
                String option=input.nextLine();
                switch (option){
                    case "1":
                        Float abalance = service.queryBalance(aname);
                        System.out.println("尊敬的用户,您可用的余额为"+abalance);
                        break;
                }
            }else {
                System.out.println("对不起,"+loginResult);
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    在这里插入图片描述

  • 相关阅读:
    backtrace输出任意线程栈信息
    Java学习禁忌
    Python全栈开发【基础-06】垃圾回收机制
    Graphviz代码流程图-智慧交通结构图
    c# 8.0的range语法糖,^和..操作符
    freeswitch1.10.7 安装&部署排坑
    【Python机器学习】零基础掌握BaggingClassifier集成学习
    elementUI table某列数据是数组,需要多行显示
    2024腾讯校招后端面试真题汇总及其解答(三)
    力扣labuladong——一刷day33
  • 原文地址:https://blog.csdn.net/m0_53222768/article/details/125414988