package com.uncle.test_io.atmsystem;
/**
* 1.实现一个银行业务系统---->网上银行
* 2.要求有如下的业务功能
* 登录
* 查询余额
* 存款
* 取款
* 转账
* 开户
* 销户
* 3.记录银行的用户信息
* 账号--密码--余额 BufferedReader readLine
*
* 分析如上的小任务
* 1.底层数据如何存储 采用文件形式.txt 每一行记录一个人的所有信息 账号-密码-余额
* 文件存储在一个固定的位置 C://test
* 文件存储在当前工程的内部
*/
import java.util.Scanner;
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);
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("尊敬的"+aname+"用户,您的可用余额为:"+abalance);
break;
}
}else{
System.out.println("对不起,"+loginResult);
}
}
}
package com.uncle.test_io.atmsystem;
import java.util.HashMap;
public class AtmDao {
//DAO作为一个层次---持久层 操作数据 读写数据
//dao中还有一个小弟 负责加载文件 更新文件数据
private FileLoaderAndCommit flac = new FileLoaderAndCommit("src\\com\\uncle\\test_io\\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);
}
}
package com.uncle.test_io.atmsystem;
public class AtmService {
//这一个类都是负责处理业务逻辑 需要底层数据的支持
private AtmDao dao = new AtmDao();
//网络银行的业务
//所有的业务方法 按照我们之前的优化结构设计
//只有业务逻辑 判断 比较 计算等等
//看不见任何数据的操作 从哪儿查出来的 存在哪儿
//设计一个业务方法 登录
public String login(String aname,String apassword){
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+",您的账户余额不足");
}
}
}
package com.uncle.test_io.atmsystem;
import java.io.*;
import java.util.HashMap;
import java.util.Iterator;
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{
try {
if(fileReader!=null) {
fileReader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if(bufferedReader!=null) {
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对象中的真实数据拼接成一行字符串
StringBuilder builder = new StringBuilder(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{
try {
if(fileWriter!=null) {
fileWriter.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if(bufferedWriter!=null) {
bufferedWriter.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
package com.uncle.test_io.atmsystem;
import java.io.Serializable;
public class User implements Serializable {
//建议除了私有属性 无参数有参数构造方法 属性对应的get、set方法
//建议类实现一个序列化接口 添加一个序列化版本号
private static final long serialVersionUID = 1406005760612010227L;
//只是为了记录数据库中的一行信息 账号 密码 余额
private String aname;
private String apassword;
private Float abalance;
public User() {}
public User(String aname, String apassword, Float abalance) {
this.aname = aname;
this.apassword = apassword;
this.abalance = abalance;
}
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 Float getAbalance() {
return abalance;
}
public void setAbalance(Float abalance) {
this.abalance = abalance;
}
}
-
我的文件内容
-
步尔斯特-123-800 大叔-666-1000 Java-888-888
-
MVC三层架构思想初识