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();
}
}
java简单取款机
最新推荐文章于 2023-11-23 22:47:29 发布