银行账户操作的简单模型

综合使用了Annotation,java反射以及jdbc技术,源码中包含的各种类为

  1. Identity注解
    package com.test.annotation;
    
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.FIELD)
    /**
     * 注释是否为主键,默认为true
     *
     */
    public @interface Identity {
    	
    	boolean value() default true;
    }

  2. Table注解
    package com.test.annotation;
    
    import java.lang.annotation.Retention;
    import java.lang.annotation.Target;
    
    //该注解存活的时间,括号中的参数为表示时间为整个RUNTIME过程
    @Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
    //表示该注解作用的范围
    @Target(java.lang.annotation.ElementType.TYPE)
    public @interface Table {
    
    	//注解的String类型的参数,默认值为tb_book,默认值可以不写
    	//value为默认的属性名称,当只有一个属性且属性名为value时,在使用注解时可以省略value=?
    	String value();
    }
    
  3. vo类
    1. User类
      package com.test.vo;
      
      import java.sql.Timestamp;
      
      import com.test.annotation.Identity;
      import com.test.annotation.Table;
      
      /**
       * 用户表格中包含的属性字段
       * @author dingshuangen
       *
       */
      @Table("User")
      public class User {
      	//userid设置为主键
      	@Identity()
      	private int userid;//用户id
      	private String account;//账户
      	private String username;//用户名
      	private String userpwd;//密码
      	private int userbalance;//余额
      	private Timestamp last_ModifiedTime;//最后修改时间
      	@Override
      	public String toString() {
      		return "User [userid=" + userid + ", account=" + account + ", username=" + username + ", userbalance="
      				+ userbalance + ", last_ModifiedTime=" + last_ModifiedTime + "]";
      	}
      	public User(String username, String userpwd) {
      		super();
      		this.username = username;
      		this.userpwd = userpwd;
      	}
      	public String getAccount() {
      		return account;
      	}
      	public void setAccount(String account) {
      		this.account = account;
      	}
      	public Timestamp getLast_ModifiedTime() {
      		return last_ModifiedTime;
      	}
      	public void setLast_ModifiedTime(Timestamp last_ModifiedTime) {
      		this.last_ModifiedTime = last_ModifiedTime;
      	}
      	public int getUserid() {
      		return userid;
      	}
      	public void setUserid(int userid) {
      		this.userid = userid;
      	}
      	public String getUsername() {
      		return username;
      	}
      	public void setUsername(String username) {
      		this.username = username;
      	}
      	public String getUserpwd() {
      		return userpwd;
      	}
      	public void setUserpwd(String userpwd) {
      		this.userpwd = userpwd;
      	}
      	
      	public int getUserbalance() {
      		return userbalance;
      	}
      	public void setUserbalance(int userbalance) {
      		this.userbalance = userbalance;
      	}
      	public User() {
      		super();
      	}
      	
      	
      }
      

    2. Operator类
      package com.test.vo;
      
      import com.test.annotation.Identity;
      import com.test.annotation.Table;
      @Table("operator")
      public class Operator {
      	@Identity()
      	private int oid;
      	private String oname;
      	private String opwd;
      	
      	public int getOid() {
      		return oid;
      	}
      	public void setOid(int oid) {
      		this.oid = oid;
      	}
      	public String getOname() {
      		return oname;
      	}
      	public void setOname(String oname) {
      		this.oname = oname;
      	}
      	public String getOpwd() {
      		return opwd;
      	}
      	public void setOpwd(String opwd) {
      		this.opwd = opwd;
      	}
      	public Operator(String oname, String opwd) {
      		super();
      		this.oname = oname;
      		this.opwd = opwd;
      	}
      	public Operator() {
      		super();
      	}
      	
      }
      

    3. Record类
      package com.test.vo;
      
      import java.sql.Timestamp;
      
      import com.test.annotation.Identity;
      import com.test.annotation.Table;
      
      @Table("record")
      public class Record {
      	
      	@Identity()
      	private int record_id;
      	private int userid;
      	private String username;
      	public String getUsername() {
      		return username;
      	}
      	public void setUsername(String username) {
      		this.username = username;
      	}
      	private int money;
      	private int new_balance;
      	private String type;
      	public String getType() {
      		return type;
      	}
      	public void setType(String type) {
      		this.type = type;
      	}
      	private Timestamp create_time;
      	public int getRecord_id() {
      		return record_id;
      	}
      	public void setRecord_id(int record_id) {
      		this.record_id = record_id;
      	}
      	
      	public int getUserid() {
      		return userid;
      	}
      	public void setUserid(int userid) {
      		this.userid = userid;
      	}
      	
      	public int getMoney() {
      		return money;
      	}
      	public void setMoney(int money) {
      		this.money = money;
      	}
      	public int getNew_balance() {
      		return new_balance;
      	}
      	public void setNew_balance(int new_balance) {
      		this.new_balance = new_balance;
      	}
      	public Timestamp getCreate_time() {
      		return create_time;
      	}
      	public void setCreate_time(Timestamp create_time) {
      		this.create_time = create_time;
      	}
      	public Record() {
      		super();
      	}
      	
      
      }

  4. Dao类
    1. BaseDao类
      package com.test.dao;
      
      import java.lang.reflect.Field;
      import java.sql.Connection;
      import java.sql.DriverManager;
      import java.sql.PreparedStatement;
      import java.sql.ResultSet;
      import java.sql.Statement;
      import java.util.ArrayList;
      import java.util.List;
      import com.test.annotation.Identity;
      import com.test.annotation.Table;
      
      public class BaseDao {
      
      	private static final String URL = "jdbc:mysql://localhost:3306/jdbc";
      	private static final String USER = "root";
      	private static final String PASSWORD = "";
      
      	/**
      	 * 获得数据库连接
      	 * 
      	 * @return
      	 */
      	public Connection getConnection() {
      		Connection conn = null;
      		try {
      			conn = DriverManager.getConnection(URL, USER, PASSWORD);
      		} catch (Exception e) {
      			e.printStackTrace();
      		}
      		return conn;
      	}
      
      	/**
      	 * 关闭连接资源
      	 * 
      	 * @param auto
      	 */
      	public void close(AutoCloseable auto) {
      		try {
      			auto.close();
      		} catch (Exception e) {
      			e.printStackTrace();
      		}
      	}
      
      	/**
      	 * 获得表名
      	 * 
      	 * @param c
      	 * @return
      	 */
      	protected String getTableName(Class<?> c) {
      		String table_name = c.getSimpleName();
      		// 判断c是否具有Table类型的Annotation
      		if (c.isAnnotationPresent(Table.class)) {
      			// 将表名更改为Annotation的注释值
      			table_name = c.getAnnotation(Table.class).value();
      		}
      		return table_name;
      	}
      
      	protected Field getIdentifyField(Class<?> c) {
      		// 获得所有的类属性信息;
      		Field[] fs = c.getDeclaredFields();
      		// 遍历查找主键属性
      		for (Field f : fs) {
      			if (f.isAnnotationPresent(Identity.class)) {
      				return f;
      			}
      		}
      		return null;
      	}
      
      	/**
      	 * 执行数据库的插入操作
      	 * 
      	 * @param obj
      	 */
      	public void insert(Object obj) {
      
      		// 获得对象的类
      		Class<?> c = obj.getClass();
      		// 获得主键属性
      		Field keyField = this.getIdentifyField(c);
      		// 获得类的所有属性
      		Field[] fs = c.getDeclaredFields();
      		// 获得表名
      		String table_name = this.getTableName(c);
      		// 拼凑插入sql语句
      		StringBuffer sql = new StringBuffer();
      		StringBuffer sql_val = new StringBuffer();
      		sql.append("insert into " + table_name + " (");
      		sql_val.append(" values(");
      		for (int i = 0; i < fs.length; i++) {
      			fs[i].setAccessible(true);
      			if (i != fs.length - 1) {
      				sql.append(fs[i].getName() + ",");
      				sql_val.append("?,");
      			} else {
      				sql.append(fs[i].getName() + ")");
      				sql_val.append("?)");
      			}
      		}
      		// 合并成完整的sql语句
      		sql.append(sql_val);
      		// 获得连接,创建声明
      		Connection conn = getConnection();
      		PreparedStatement ps = null;
      		ResultSet rs = null;
      		try {
      			// 如果有主键则获得返回的主键值
      			if (keyField != null) {
      				ps = conn.prepareStatement(sql.toString(), Statement.RETURN_GENERATED_KEYS);
      			} else {
      				ps = conn.prepareStatement(sql.toString());
      			}
      			// 设置参数
      			for (int i = 0; i < fs.length; i++) {
      				// 设置属性的可访问性
      				fs[i].setAccessible(true);
      				// 主键位置不赋值,置为null
      				if (fs[i] == keyField) {
      					ps.setObject(i + 1, null);
      				} else {
      					// 给非主键位置赋值
      					ps.setObject(i + 1, fs[i].get(obj));
      				}
      			}
      			// 执行插入语句
      			ps.execute();
      			System.out.println("执行插入操作成功");
      
      			// 获得自动生成的主键值
      			if (keyField != null) {
      				rs = ps.getGeneratedKeys();
      				rs.next(); // 移动光标
      				int key = rs.getInt(1); // 获得主键
      				keyField.setAccessible(true);
      				// 给ov对象的主键属性赋值
      				keyField.set(obj, key);
      			}
      		} catch (Exception e) {
      			e.printStackTrace();
      		} finally {
      			close(ps);
      			close(conn);
      		}
      	}
      
      	/**
      	 * 查询所有记录
      	 * 
      	 * @param c
      	 * @return
      	 */
      	public <T> List<T> getAll(Class<T> c) {
      		List<T> list = new ArrayList<T>();
      		Connection conn = getConnection();
      		Field[] f = c.getDeclaredFields();
      		PreparedStatement ps = null;
      		ResultSet rs = null;
      		try {
      
      			ps = conn.prepareStatement("select * from " + this.getTableName(c));
      			rs = ps.executeQuery();
      			while (rs.next()) {
      				// 调用无参的构造方法创建一个对象
      				T t = c.newInstance();
      				for (Field fs : f) {
      					// 设置访问权限
      					fs.setAccessible(true);
      					// 为t的每一个属性赋值
      					fs.set(t, rs.getObject(fs.getName()));
      				}
      				// 将每一个对象数据存储到List中
      				list.add(t);
      			}
      		} catch (Exception e) {
      			e.printStackTrace();
      		} finally {
      			close(rs);
      			close(ps);
      			close(conn);
      		}
      		return list;
      	}
      	
      }
      

    2. UserDao类
      package com.test.dao;
      
      import java.lang.reflect.Field;
      import java.sql.Connection;
      import java.sql.PreparedStatement;
      import java.sql.ResultSet;
      import java.sql.Timestamp;
      import java.util.Scanner;
      
      import com.test.vo.Record;
      import com.test.vo.User;
      
      public class UserDao extends BaseDao {
      
      	private static Scanner s=new Scanner(System.in);//全局类变量
      	
      	/**
      	 * 登录成功之后才能进行操作
      	 */
      	public  void user_Login() {
      		
      		Connection conn=this.getConnection();
      		PreparedStatement ps=null;
      		ResultSet rs= null;
      		try {
      			//登录验证的标志
      			boolean login=false;
      			while(!login) {
      				System.out.println("请输入用户名");
      				String username=s.nextLine();
      				System.out.println("请输入密码");
      				String userpwd=s.nextLine();
      				System.out.println("select * from "+this.getTableName(User.class)+"  where username= ? and userpwd= ?");
      				ps=conn.prepareStatement("select * from "+this.getTableName(User.class)+" where username = ? and userpwd = ?");
      				ps.setString(1,username);
      				ps.setString(2,userpwd);
      				rs=ps.executeQuery();
      				if(rs.next()) {
      					login=true;
      					System.out.println("欢迎您:"+username);
      					User user=new User();
      					//登录成功后将用户的所有信息赋给User
      					Field[] f=user.getClass().getDeclaredFields();
      					for(Field fs:f) {
      						//设置访问权限
      						fs.setAccessible(true);
      						//为t的每一个属性赋值
      						fs.set(user, rs.getObject(fs.getName()));
      					}		
      					this.fucation(user);
      					
      				}else {
      					System.out.println("您输入的用户名或密码错误,请检查后重新输入");
      				}
      			}
      		}catch(Exception e) {
      			e.printStackTrace();
      		}finally {
      			this.close(rs);
      			this.close(ps);
      			this.close(conn);
      		}
      	}
      	/**
      	 * 存钱操作
      	 * @param user
      	 */
      	private void draw(User user) {
      		
      		System.out.println("请输入您要取出的金额");
      		int money=s.nextInt();
      		if(money>user.getUserbalance()) {
      			System.out.println("您的余额不足!");
      		}else {
      			//更新余额信息,同时设置当前时间
      			user.setUserbalance(user.getUserbalance()-money);
      			user.setLast_ModifiedTime(new Timestamp(System.currentTimeMillis()));
      			//对数据库表格信息进行修改
      			this.updateAll(user);
      			this.insertRecord(user, -money, "取款");
      			
      		}
      	}
      	
      	/**
      	 * 取钱操作,对数据库信息更新
      	 * @param user
      	 */
      	private void deposit(User user) {
      
      		System.out.println("请输入您要存入的金额");
      		int m=s.nextInt();
      		//更新余额信息,同时设置当前时间
      		user.setUserbalance(user.getUserbalance()+m);
      		user.setLast_ModifiedTime(new Timestamp(System.currentTimeMillis()));
      		//对数据库表格信息进行修改
      		this.updateAll(user);
      		//记录用户操作记录
      		this.insertRecord(user, m, "存钱");
      	}
      	
      	/**
      	 * 转账
      	 * @param user
      	 */
      	private void transfer(User user) {
      		System.out.println("请输入转账金额");
      		int m=s.nextInt();
      		if(m>user.getUserbalance()) {
      			System.out.println("您的余额不足");
      		}else {
      			System.out.println("请输入转入账户的卡号");
      			String account=s.nextLine();
      			System.out.println("请输入转入账户的用户名");
      			String name=s.nextLine();
      			User t=this.get(User.class,name,account);
      			if(t!=null) {
      				System.out.println(t);
      				t.setUserbalance(t.getUserbalance()+m);
      				this.insertRecord(t, m, "他人转账");
      				user.setUserbalance(user.getUserbalance()-m);
      				this.insertRecord(user, -m, "转账");
      				this.updateAll(t);
      				this.updateAll(user);
      			}else {
      				System.out.println("您输入的用户名或者卡号错误");
      			}
      		}
      		
      		
      	}
      	/**
      	 * 查询用户的信息
      	 */
      	private void selectInfo(User user) {
      		System.out.println(user.toString());
      	}
      	
      	/**
      	 * 功能
      	 * @param user
      	 */
      	private void fucation(User user) {
      		System.out.println("----功能区----:\n1:取钱\n2:存钱\n3:转账\n4查询个人信息\n5:修改个人信息\n6:退出");
      		while(true) {
      			System.out.println("请输入功能区对应的数字选择您要进行的操作");
      			int n=s.nextInt();
      			if(n==1) {
      				this.draw(user);
      			}
      			
      			if(n==2) {
      				this.deposit(user);
      			}
      			if(n==3) {
      				this.transfer(user);
      			}
      			if(n==4) {
      				this.selectInfo(user);
      			}
      			if(n==5) {
      				this.updateAll(user);
      			}
      			if(n==6) {
      				//退出时关闭所有资源连接
      				s.close();
      				System.out.println("退出成功");
      				break;
      			}
      		}
      	}
      	
      	/**
      	 * 根据用户名和卡号查询用户信息
      	 * @param c
      	 * @param name
      	 * @param account
      	 * @return
      	 */
      	private <T> T get(Class<T> c,String name,String account) {
      		T t =null;
      		Connection conn = getConnection();
      		Field[] f = c.getDeclaredFields();
      		String sql="select * from " + this.getTableName(c)+" where username= ? and account = ?";
      		System.out.println(sql);
      		PreparedStatement ps = null;
      		ResultSet rs = null;
      		try {
      			ps = conn.prepareStatement(sql);
      			ps.setString(1, name);
      			ps.setString(2, account);
      			rs = ps.executeQuery();
      			while (rs.next()) {
      				// 调用无参的构造方法创建一个对象
      				t = c.newInstance();
      				for (Field fs : f) {
      					// 设置访问权限
      					fs.setAccessible(true);
      					// 为t的每一个属性赋值
      					fs.set(t, rs.getObject(fs.getName()));
      				}
      			}
      		} catch (Exception e) {
      			e.printStackTrace();
      		} finally {
      			close(rs);
      			close(ps);
      			close(conn);
      		}
      		return t;
      	}
      	public void updateAll(User obj) {
      
      		// 获得主键属性
      		Field keyField = this.getIdentifyField(obj.getClass());
      		// 获得类的所有属性
      		Field[] fs = obj.getClass().getDeclaredFields();
      		// 获得表名
      		String table_name = this.getTableName(obj.getClass());
      		// 拼凑更新sql语句
      		StringBuffer sql = new StringBuffer();
      		sql.append("update " + table_name + " set ");
      		for (int i = 0; i < fs.length; i++) {
      			fs[i].setAccessible(true);
      			if (i != fs.length - 1) {
      				sql.append(fs[i].getName() + " = ? , ");
      			} else {
      				keyField.setAccessible(true);
      				sql.append(fs[i].getName() + " = ? where "+keyField.getName()+" = ?");
      			}
      		}
      		System.out.println(sql.toString());
      		Connection conn = this.getConnection();
      		PreparedStatement ps = null;
      		try {
      			ps=conn.prepareStatement(sql.toString());
      			//设置新的用户数据
      			for(int i=0;i<fs.length;i++) {
      				ps.setObject(i+1,fs[i].get(obj));
      			}
      			ps.setObject(fs.length+1, keyField.get(obj));
      			//执行更新语句
      			ps.execute();
      			System.out.println("修改个人信息成功");
      			this.insertRecord(obj, 0, "修改个人信息");
      		}catch(Exception e) {
      			e.printStackTrace();
      		}finally {
      			this.close(ps);
      			this.close(conn);
      		}
      	}
      	
      	/**
      	 * 用户操作记录
      	 * @param user
      	 * @param money
      	 */
      	private void insertRecord(User user,int money,String type) {
      		Record rd=new Record();
      		rd.setCreate_time(new Timestamp(System.currentTimeMillis()));
      		rd.setMoney(money);
      		rd.setType(type);
      		rd.setNew_balance(user.getUserbalance());
      		rd.setUserid(user.getUserid());
      		rd.setUsername(user.getUsername());
      		this.insert(rd);
      		System.out.println("你的操作记录以保存");
      	}
      }
      

    3. Operator类
      package com.test.dao;
      
      import java.lang.reflect.Field;
      import java.sql.Connection;
      import java.sql.PreparedStatement;
      import java.sql.ResultSet;
      import java.sql.Timestamp;
      import java.util.List;
      import java.util.Random;
      import java.util.Scanner;
      
      import com.test.vo.Operator;
      import com.test.vo.Record;
      import com.test.vo.User;
      
      public class OperatorDao extends BaseDao{
      
      	private static Scanner s=new Scanner(System.in);//全局类变量
      	public  void operator_Login() {
      		
      		Connection conn=this.getConnection();
      		PreparedStatement ps=null;
      		ResultSet rs= null;
      		try {
      			//登录验证的标志
      			boolean login=false;
      			while(!login) {
      				System.out.println("请输入员工用户名");
      				String oname=s.next();
      				System.out.println("请输入密码");
      				String opwd=s.next();
      				System.out.println("select * from "+this.getTableName(Operator.class)+"  where oname= ? and opwd= ?");
      				ps=conn.prepareStatement("select * from "+this.getTableName(Operator.class)+" where oname = ? and opwd = ?");
      				ps.setString(1,oname);
      				ps.setString(2,opwd);
      				rs=ps.executeQuery();
      				if(rs.next()) {
      					login=true;
      					System.out.println("---欢迎你:"+oname+" 使用银行账户管理系统--");
      					Operator operator=new Operator();
      					//登录成功后将员工的所有信息赋给operator
      					Field[] f=operator.getClass().getDeclaredFields();
      					for(Field fs:f) {
      						//设置访问权限
      						fs.setAccessible(true);
      						//为t的每一个属性赋值
      						fs.set(operator, rs.getObject(fs.getName()));
      					}		
      					this.fucation(operator);
      					
      				}else {
      					System.out.println("您输入的用户名或密码错误,请检查后重新输入");
      				}
      			}
      		}catch(Exception e) {
      			e.printStackTrace();
      		}finally {
      			this.close(rs);
      			this.close(ps);
      			this.close(conn);
      		}
      	}
      	
      	/**
      	 * 功能
      	 * @param user
      	 */
      	private void fucation(Operator operator) {
      		System.out.println("-·-·-·-|功能区|-·-·-·-:\n1:开户\n2:销户\n3:查询用户信息\n4:高级查询\n5:退出");
      		while(true) {
      			System.out.println("请输入功能区对应的数字选择您要进行的操作");
      			int n=s.nextInt();
      			if(n==1) {
      				this.createNewAccount();
      			}
      			if(n==2) {
      				this.delete();
      			}
      			if(n==3) {
      				List<User> list=this.getAll(User.class);
      				int i=0;
      				for (User user : list) {
      					System.out.println((i++)+":"+user.toString());
      				}
      			}
      			if(n==4) {
      				this.getAll(Record.class);
      			}
      			if(n==5) {
      				System.out.println("退出当前系统成功");
      				break;
      			}else {
      				System.out.println("输入的序号错误");
      			}
      		}
      	}
      	
      	/**
      	 * 生成16位随机卡号
      	 */
      	private String randomAccount() {
      		Random ran=new Random();
      		int a=ran.nextInt(99999999);
      		int b=ran.nextInt(99999999);
      		long l=a*10000000L+b; 
      		return String.valueOf(l);
      	}
      	
      	/**
      	 * 开户
      	 */
      	private void createNewAccount() {
      		User user=new User();
      		System.out.println("请输入开户户名");
      		user.setUsername(s.next());
      		System.out.println("请输入开户密码");
      		user.setUserpwd(s.next());
      		user.setAccount(randomAccount());
      		System.out.println("请输入开户的初始金额");
      		user.setUserbalance(s.nextInt());
      		user.setLast_ModifiedTime(new Timestamp(System.currentTimeMillis()));
      		this.insert(user);
      	}
      	/**
      	 * 销户
      	 * @param user
      	 */
      	public void delete() {
      
      		System.out.println("请输入要注销的用户id");
      		int userid=s.nextInt();
      		// 获得对象的类
      		Class<?> c = User.class;
      		// 获得主键属性
      		Field keyField = this.getIdentifyField(c);
      		// 获得表名
      		String table_name = this.getTableName(c);
      		String sql="delete from "+table_name+" where "+keyField.getName()+" = ?";
      		// 获得连接,创建声明
      		Connection conn = getConnection();
      		PreparedStatement ps = null;
      		try {
      			ps = conn.prepareStatement(sql);
      			ps.setObject(1, userid);
      			// 执行删除语句
      			ps.execute();
      			System.out.println("执行删除操作成功");
      		} catch (Exception e) {
      			e.printStackTrace();
      		} finally {
      			close(ps);
      			close(conn);
      		}
      	}
      }
      

  5. Test类
    package com.test.test;
    
    import java.util.Scanner;
    
    import com.test.dao.OperatorDao;
    import com.test.dao.UserDao;
    
    public class Test {
    
    	public static void main(String[] args) {
    		Scanner scanner=new Scanner(System.in);
    		System.out.println("·····欢迎使用银行账户管理系统·····\n请选择您的账户类型");
    		System.out.println("A:普通用户\nB:银行员工");
    		String n=scanner.nextLine();
    		if(n.equals("A")) {
    			UserDao dao= new UserDao();
    			dao.user_Login();
    		}
    		if(n.equals("B")) {
    			OperatorDao dao= new OperatorDao();
    			dao.operator_Login();
    		}else {
    			scanner.close();
    			System.out.println("输入有误,退出当前系统");
    			System.exit(0);
    		}
    	}
    
    }
    

  6. user表格
  7. Record表格
  8. Operator表格



项目名称:Bank Account Management System 银行账户管理系统 简称BAM 项目描述:这是一个基于C/S结构的银行账户在线管理系统,用户可以通过ATM终端界面来操作自己的银行账户. 项目实施方式:这是一个同步练习,随着达内CoreJava课程的深入,这个项目将趋于完整,学员的任务是随着知识点的深入,完成每一个进阶的项目要求. 项目一 练习1:(面向对象基础语法) 写一个账户类(Account),属性: id:账户号码 长整数 password:账户密码 name:真实姓名 personId:身份证号码 字符串类型 email:客户的电子邮箱 balance:账户余额 方法: deposit: 存款方法,参数是double型的金额 withdraw:取款方法,参数是double型的金额 构造方法: 有参和无参,有参构造方法用于设置必要的属性 练习2:(封装) 将Account类作成完全封装,注意:要辨别每个属性的set/get方法是否需要公开 练习3:(继承,多态) 银行的客户分为两类,储蓄账户(SavingAccount)和信用账户(CreditAccount),区别在于储蓄账户不允许透支,而信用账户可以透支,并允许用户设置自己的透支额度. 注意:CreditAccount需要多一个属性 ceiling 透支额度 为这两种用户编写相关的类 同时要求编写Bank类,属性: 1.当前所有的账户对象的集合,存放在数组中 2.当前账户数量 方法: 1.用户开户,需要的参数:id,密码,密码确认,姓名,身份证号码,邮箱,账户类型(int),返回新创建的Account对象 2.用户登录,参数:id,密码 返回Account对象,提示 用s1.equals(s2)判断s1和s2两个字符串内容是否相等 3.用户存款,参数:id,存款数额,返回修改过的Account对象 4.用户取款,参数:id,取款数额,返回修改过的Account对象 5.设置透支额度 参数:id,新的额度 ,返回修改过的Account对象.这个方法需要验证账户是否是信用账户 用户会通过调用Bank对象以上的方法操作自己的账户,请分析各个方法需要的参数 另外,请为Bank类添加几个统计方法 1.统计银行所有账户余额总数 2.统计所有信用账户透支额度总数 写个主方法测试你写的类 项目二 练习4:(语言高级特性,三个修饰符) 1.修改Account类,银行用户的账号(id)是自动生成的,初始值为100000,第一个开户的用户id为100001,第二个为100002,依此类推. 提示:构造对象的时候采用static属性为id赋值 2.对于Account类,有两个方法,存款方法和取款方法,请修改这两个方法. 存款方法改为不允许子类修改 取款方法根据不同的子类而不同,因此,改为抽象方法,在两个子类中分别实现 3.将Bank类作成单例 项目三 练习5:(接口) 为SavingAccount和CreditAccount各自添加一个子类 LoanSavingAccount类:用户可以贷款,不可以透支 LoanCreditAccount类:用户可以贷款,可以透支 说明:贷款和透支是不一样的,透支指的是账户余额小于0,而贷款用户需要一个贷款额的属性. 在ATM机上,用户可以选择贷款,也可以选择还贷款,而还贷款就是要把账户余额上的资金转到贷款额上 例如:用户余额10000元,贷款额100000元,用户可以选择还款5000元,则用户余额变为5000,贷款额变为95000元. 利用接口来抽象出LoanSavingAccount类和LoanCreditAccount类的共性 接口中的方法: requestLoan:贷款 payLoan:还贷 getLoan:获取用户贷款总额 为Bank类添加三个方法, 贷款:参数 id,贷款额,返回修改过的Account对象 还贷款:参数 id,还款额,返回修改过的Account对象 统计所有账户贷款的总数 练习6:(Object) 为Account类及其子类添加toString方法和equals方法 项目四 练习7:(Exception) 为BAM添加几个异常类 BalanceNotEnoughException :用于取钱的时候余额不足的情况(包括账户余额超过透支额的情况) RegisterException:用于开户异常的情况,例如密码两次输入不一致等情况 LoginException:用户登录异常的情况,例如id错误,密码错误 LoanException:贷款额不能为负数,如果用户试图将贷款额置为负数,则会抛出这个异常 以上四个异常类有一个共同的父类 BusinessException 并妥善的处理这些异常 项目五 练习8:(集合) 改写Bank类,采用集合的方式来管理多个Account对象 为Bank类添加一个方法 打印所有用户的总资产排名 说明:一个用户可能会有多个账号,以身份证号为准.总资产指多个账户余额的总和,不需要考虑贷款账户的贷款额 项目六 练习9:(GUI) 为BAM添加用户界面 需要以下几个类: BAMClient 其中会包含一个Frame,这是用户主界面 MainPanel:主界面,用户可以选择开户或者登录 RegisterPanel:用户开户具体用到的界面 LoginPanel:用户登录需要的界面 BusinessPanel:界面上会显示账户的功能 至少包括存款和取款,对于可透支的用户,还允许用户修改透支额度,对于贷款用户,还允许用户贷款和还贷款 注:本练习的界面布局不做要求,请阅读现有代码,添加事件处理代码 提示:在开户或者登录之后都会跳到BusinessPanel,而用户点击了交易之后,界面停留在BusinessPanel 要随时注意在BusinessPanel上根据数据的变化更新显示信息 项目七 在该加资源保护的地方加上,没有标准 项目八 练习10:(I/O) 修改Bank类,账户信息会采用对象序列化的方式存放在文件中.当Bank对象生成的时候会读取文件,设置账户集合.当账户信息改变的时候,会随时更新文件 设计一个FileDAO类(文件数据访问对象),负责对文件的访问,包括存放账户,提取账户方法,在Bank类中,会通过FileDAO对象来访问文件 注意:如果已有的账户对象会存在文件中,那么为新的账户对象分配id的做法也应相应的改变,过去的用static属性的做法不再合适,应该改为,把下一个可用的id存放在一个文件中,每创建一个新对象的时候都会读取这个文件,获得新对象的id,并且修改文件中的id,使其加1.这个工作可以放在Account类的构造方法中 项目九 练习11:(网络) 在现有的BAM中,用户是通过界面直接访问Bank对象的,将其改为C/S结构,由界面充当客户端,通过TCP协议访问服务器端的Bank对象. 提示:客户端和服务器端需要通过对象来传递信息,这里会使用对象序列化技术.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值