java简单取款机

package com.xiuye.oracle;

import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;

import oracle.jdbc.OracleDriver;

public class jdbc10 {

	private static Connection conn = null;

	public static void main(String[] args) {

		/**
		 * 1.选择界面:取钱,存钱,转账 2.取钱 1)钱够就取 2)不够提示“余额不足” 3.存钱 1)存 4.转账 5.提示一下成功。
		 * 
		 */
		Driver driver = new OracleDriver();

		Statement stmt = null;
		try {
			DriverManager.registerDriver(driver);
			conn = DriverManager.getConnection(
					"jdbc:oracle:thin:@localhost:1521:orcl", "scott", "123456");

			stmt = conn.createStatement();

		} catch (SQLException e) {

			e.printStackTrace();
		}

		Scanner in = new Scanner(System.in);

		/**
		 * 关闭自动提交,方便安全的处理数据。
		 * 因为sql的执行会自动提交,关闭自动提交
		 * 相当与在内存中操作了数据,如果数据有误
		 * 就可以rollback.
		 * 
		 * 
		 */

		try {
			/**
			 * 
			 * 关闭自动提交
			 */
			conn.setAutoCommit(false);
			
			/**
			 * 核实用户并处理相关业务。
			 * 
			 * 
			 */
			checkAndHandle(stmt, in);

		} catch (SQLException e) {

			System.out.println("数据操作失败!");
			//e.printStackTrace();
		} catch (InterruptedException e) {
			System.out.println("异常中断请重新选择!");
			//e.printStackTrace();
		}catch(Exception e)
		{
			System.out.println("输入非法字符!");
			
			//e.printStackTrace();
		}
		finally {
			try {
				System.out.println("您已退出!请取卡!");
				stmt.close();
				conn.close();
			} catch (SQLException e) {

			}

		}

	}

	/**
	 * 检验用户名密码,和事务处理。
	 * 事务包括:
	 * 1.取钱,
	 * 2.存钱,
	 * 3.转账,
	 * 4.改密,
	 * 5.退出
	 * 
	 * 
	 * @param stmt
	 * @param in
	 * @throws SQLException
	 * @throws InterruptedException
	 */
	private static void checkAndHandle(Statement stmt, Scanner in)
			throws SQLException, InterruptedException {

		//检查用户名和密码是否正确
		validateUser(stmt, in);
		
		while (true) {
			//选项
			System.out.println("选项:1.取钱,2.存钱,3.转账,4.改密,5.退出\n");
			int selectedIndex = in.nextInt();
			//因为nextInt()后的字符会自动到下一个nextXXX(),所以最好多加一句nextLine()
			//把回车消灭掉。
			in.nextLine();
			
			switch (selectedIndex) {
			case 1:
				userGetMoney(stmt, in);//取钱
				break;
			case 2:
				userSaveMoney(stmt, in);//存钱
				break;
			case 3:
				userTransferAccounts(stmt, in);//转账
				break;
			case 4:
				changeUserPassword(stmt, in);//改密
				break;
			case 5:
				//退出
				return;

			}
		}

	}
	
	
	/**
	 * 改密功能:
	 * 即修改用户密码,
	 * 1.首先查询旧密码,如果成功就继续下一步。(虽然开始登录的时候已经保存了旧密码,但为了安全还是再次确认下。)
	 * 2.输入新密码,再次输入新密码。
	 * 3.两次输入密码确认是否相等,如果相等就执行下一步
	 * 4.进行数据库sql语句操作。
	 * 5.如果上一步正确,commit()提交数据;
	 * 
	 * @param stmt
	 * @param in
	 * @throws SQLException
	 */
	private static void changeUserPassword(Statement stmt, Scanner in)
			throws SQLException {

		System.out.println("请输入旧密码:");
		String oldPwd = in.nextLine();

		String sql = "select password from userinfo where username ='"
				+ username + "' and password='" + oldPwd + "'";

		ResultSet rs = stmt.executeQuery(sql);

		if (rs.next()) {
			
			System.out.println("请输入新密码:");
			String newPwd = in.nextLine();

			System.out.println("再次输入新密码:");
			String repeatedNewPwd = in.nextLine();

			if (newPwd.equals(repeatedNewPwd)) {
				sql = "update userinfo set password='" + repeatedNewPwd + "'"
						+ " where username='" + username + "'";
				int flag = stmt.executeUpdate(sql);

				if (flag > 0) {
					System.out.println("改密成功!");
				} else {
					System.out.println("改密失败!");
				}
			} else {
				System.out.println("两次密码输入不一致!");
			}

		} else {
			System.out.println("输入旧密码错误!");
		}

	}

	// 转账错误计数	
	private static int transferErrorCount = 0;

	
	/**
	 * 用户转账操作
	 * 1.输入对方帐号,先对对方帐号进行确认,如果查不到,出错,提示没有那个帐号。
	 * 2.以上正确,输入转账金额。
	 * 3.对自己的帐号资金进行扣除,如果正确进行下一步。
	 * 4.对对方帐号资金进行增加操作,如果成功就正确。
	 * 5.所有扣除,增加均是在sql语句中进行。
	 * 
	 * 本帐号系统不支持透支
	 *其实应该有对自己的资金多少进行判断,如果转账金额过大就应该终止。
	 * 3次输入有错误,在本次程序执行期间都会无法转账,除非重新登录。
	 * 
	 * @param stmt
	 * @param in
	 * @throws SQLException
	 * @throws InterruptedException
	 */
	private static void userTransferAccounts(Statement stmt, Scanner in)
			throws SQLException, InterruptedException {

		if (transferErrorCount >= 3) {
			System.out.println("对不起,您已转账失败3次,请取卡重新插卡转账。或者帐号无误请到银行柜台办理业务。");
			
			return;
		}

		System.out.println("请输入转账帐号:");

		int otherID = in.nextInt();

		String getOwnMoneySql = "select account from userinfo where id="
				+ otherID;

		ResultSet rs = stmt.executeQuery(getOwnMoneySql);

		int otherOwnMoney = 0;

		if (rs.next()) {
			otherOwnMoney = rs.getInt(1);
			rs.close();
		} else {
			transferErrorCount++;
			System.out.println("查找不到对方帐号,请核对后再试!");
			return;
		}

		System.out.println("请输入转账金额(整数):");

		int transferMoney = in.nextInt();

		//验证账户金额数是否会超支
		String sql = "select account from userinfo where username='" + username
				+ "' and password='" + password + "'";
		rs = stmt.executeQuery(sql);
		
		if(rs.next())
		{
			int moneyNum = rs.getInt(1);
			if(moneyNum < transferMoney)
			{
				System.out.println("转出款项超过本帐号存款数,不支持本次转账!");
				return;
			}
		}
		
		
		String mySql = "update userinfo set account=account-" + transferMoney
				+ " where username='" + username + "' " + "and password='"
				+ password + "'";

		int flag = stmt.executeUpdate(mySql);

		if (flag == 0) {

			transferErrorCount++;
			System.out.println("转账失败!请稍候再试!");

			return;
		}

		String otherSql = "update userinfo set account=account+"
				+ transferMoney + " where id=" + otherID;

		flag = stmt.executeUpdate(otherSql);

		if (flag > 0) {
			System.out.print("正在转账");
			printTimerDot();
			Thread.sleep(1000);
			System.out.println("转账完毕!");
			conn.commit();
		} else {
			transferErrorCount++;
			conn.rollback();
			System.out.println("转帐失败!");
		}

	}

	/**
	 * 存款操作:
	 * 1.输入金额
	 * 2.插入sql语句
	 * 3.执行操作,然后commit。
	 * 
	 * 
	 * @param stmt
	 * @param in
	 * @throws SQLException
	 * @throws InterruptedException
	 */
	private static void userSaveMoney(Statement stmt, Scanner in)
			throws SQLException, InterruptedException {

		System.out.println("请输入存款金额:");

		int saveMoney = in.nextInt();

		String sql = "update userinfo set account=account+" + saveMoney
				+ " where username='" + username + "' and " + "password='"
				+ password + "'";

		int flag = stmt.executeUpdate(sql);

		if (flag > 0) {
			System.out.print("正在点钞请稍候");
			printTimerDot();
			Thread.sleep(1000);
			System.out.println("存款完毕!");
			conn.commit();

		} else {

			System.out.println("存款失败,请取出!");
		}

	}

	/**
	 * 取钱操作:
	 * 1.输入取款数额,查询现有账户存款,进行对比。
	 * 2.如果取款小于存款,继续执行下一步。
	 * 3.操作数据库sql语句使账户的存款减少取款额度,执行update操作,然后commit。
	 * 
	 * @param stmt
	 * @param in
	 * @throws SQLException
	 * @throws InterruptedException
	 */
	private static void userGetMoney(Statement stmt, Scanner in)
			throws SQLException, InterruptedException {
		System.out.println("请输入取款金额(整数):");
		int account = in.nextInt();
		String sql = "select account from userinfo where username='" + username
				+ "' and password='" + password + "'";
		ResultSet rs = stmt.executeQuery(sql);

		if (rs.next()) {

			int userAccount = rs.getInt(1);
			if (account > userAccount) {
				System.out.println("余额不足!");
				return;
			} else {
				sql = "update userinfo set account=account-" + account
						+ " where username='" + username + "' and password='"
						+ password + "'";
				int flag = stmt.executeUpdate(sql);
				if (flag > 0) {
					System.out.print("正在点钞请稍候");
					printTimerDot();
					Thread.sleep(1000);

					System.out.println("您已取款:" + account + ",余额为:"
							+ (userAccount - account));

					conn.commit();
				} else {
					System.out.println("取款失败!");
					return;
				}
			}

		} else {
			System.out.println("未查询到您的账目,请稍后再试,或者到银行处理。");
		}
	}

	//保存用户名和密码使之用于全局。
	private static String username = "";
	private static String password = "";

	/**
	 * 
	 * 验证用户密码
	 * 3次登录失败自动退出。
	 * 
	 * @param stmt
	 * @param in
	 * @throws SQLException
	 */
	private static void validateUser(Statement stmt, Scanner in)
			throws SQLException {
		int count = 0;
		boolean flag = false;
		while (true) {
			if (flag) {
				break;
			}
			if (count >= 3) {
				System.out.println("连续3次输入失败,该帐号已被锁定,请到银行解锁...");
				System.out.println("本次操作结束!");
				System.exit(0);
			}
			System.out.println("\t=========ATM=========\n\n");
			System.out.println("\t请登录...\t\n");
			System.out.println("请输入用户名:");
			username = in.nextLine();
			System.out.println("输入密码:");
			password = in.nextLine();

			String sql = "select * from userinfo where username = '" + username
					+ "' and password = '" + password + "'";
			ResultSet rs = stmt.executeQuery(sql);

			if (rs.next()) {
				System.out.println("登录成功!");
				flag = true;
			} else {
				System.out.println("用户名或密码错误!请重新输入...");
				flag = false;
			}

			rs.close();

			count++;
		}
		System.out.println("==============================================\n");
	}

	/**
	 * 操作计时
	 * 就是在计算机执行非人为操作时,即程序自动执行操作时,如点钞,打印小圆点,
	 * 模拟操作进度。
	 * 
	 * @throws InterruptedException
	 */
	private static void printTimerDot() throws InterruptedException {
		for (int i = 0; i < 6; i++) {
			Thread.sleep(500);
			System.out.print(".");
		}
		System.out.println();
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值