java模拟ATM功能(控制台连接Mysql数据库)

以下是详细讲解“java模拟ATM功能(控制台连接Mysql数据库)”的完整攻略:

系统要求

  • JDK 1.8 或以上版本
  • Mysql 5.0 或以上版本

准备工作

  1. 创建一个名为 atm 的 Mysql 数据库
    CREATE DATABASE atm;
  2. 创建一个名为 users 的表,用于储存 ATM 用户信息
    USE atm;
    CREATE TABLE users (
    id INT(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,
    card_id VARCHAR(20) NOT NULL,
    password CHAR(32) NOT NULL,
    balance DECIMAL(10,2) NOT NULL
    );

连接数据库

  1. 导入 jdbc 驱动
    java
    // 加载驱动,需要将驱动 JAR 包放入工程的 CLASSPATH 中
    Class.forName("com.mysql.jdbc.Driver");
  2. 建立数据库连接
    java
    String url = "jdbc:mysql://localhost:3306/atm?useSSL=false&characterEncoding=utf-8";
    String username = "root";
    String password = "123456";
    Connection connection = DriverManager.getConnection(url, username, password);

    其中,url 表示连接字符串,其中 3306 是数据库服务的端口号,atm 是数据库名,useSSL=false 表示不使用 SSL 连接,characterEncoding=utf-8 表示使用 UTF-8 编码。
  3. 执行 SQL 语句
    java
    Statement statement = connection.createStatement();
    ResultSet resultSet = statement.executeQuery("SELECT * FROM users");
    while (resultSet.next()) {
    int id = resultSet.getInt("id");
    String cardId = resultSet.getString("card_id");
    String password = resultSet.getString("password");
    double balance = resultSet.getDouble("balance");
    System.out.printf("ID:%d,卡号:%s,密码:%s,余额:%.2f\n", id, cardId, password, balance);
    }

ATM 功能设计

ATM 功能主要分为登陆、查询、取款、存款、转账、修改密码和退出等功能。

登陆

登陆需要用户输入银行卡号和密码,然后验证是否匹配数据库中的信息。

// 判断是否存在该用户
PreparedStatement checkUserStmt = connection.prepareStatement("SELECT * FROM users WHERE card_id = ? AND password = ?");
checkUserStmt.setString(1, cardId);
checkUserStmt.setString(2, password);
ResultSet resultSet = checkUserStmt.executeQuery();
if (resultSet.next()) {
    // 登陆成功
} else {
    // 登陆失败
}

查询

查询需要显示当前账户的余额。

PreparedStatement checkBalanceStmt = connection.prepareStatement("SELECT balance FROM users WHERE card_id = ?");
checkBalanceStmt.setString(1, cardId);
ResultSet resultSet = checkBalanceStmt.executeQuery();
if (resultSet.next()) {
    double balance = resultSet.getDouble("balance");
    System.out.printf("您的余额为:%.2f\n", balance);
} else {
    System.out.println("查询失败,请重新尝试!");
}

取款

取款需要输入取款金额,并进行余额的检查。如果余额足够,就会更新数据库中的余额信息。

// 检查余额是否足够
PreparedStatement checkBalanceStmt = connection.prepareStatement("SELECT balance FROM users WHERE card_id = ?");
checkBalanceStmt.setString(1, cardId);
ResultSet resultSet = checkBalanceStmt.executeQuery();
if (resultSet.next()) {
    double balance = resultSet.getDouble("balance");
    if (balance >= amount) {
        // 更新余额
        PreparedStatement updateBalanceStmt = connection.prepareStatement("UPDATE users SET balance = balance - ? WHERE card_id = ?");
        updateBalanceStmt.setDouble(1, amount);
        updateBalanceStmt.setString(2, cardId);
        updateBalanceStmt.executeUpdate();
        System.out.printf("取款成功,当前余额为:%.2f\n", balance - amount);
    } else {
        System.out.println("余额不足!");
    }
} else {
    System.out.println("查询失败,请重新尝试!");
}

存款

存款需要输入存款金额,并将其添加到数据库中。

// 更新余额
PreparedStatement updateBalanceStmt = connection.prepareStatement("UPDATE users SET balance = balance + ? WHERE card_id = ?");
updateBalanceStmt.setDouble(1, amount);
updateBalanceStmt.setString(2, cardId);
updateBalanceStmt.executeUpdate();
System.out.printf("存款成功,当前余额为:%.2f\n", currentBalance + amount);

转账

转账需要输入目标账户的银行卡号和转账金额,并进行余额的检查。如果余额足够,就会更新数据库中的余额信息。

// 判断目标账户是否存在
PreparedStatement checkTargetUserStmt = connection.prepareStatement("SELECT balance FROM users WHERE card_id = ?");
checkTargetUserStmt.setString(1, targetCardId);
ResultSet targetResultSet = checkTargetUserStmt.executeQuery();
if (targetResultSet.next()) {
    double targetBalance = targetResultSet.getDouble("balance");
    if (currentBalance >= amount) {
        // 更新余额
        PreparedStatement updateBalanceStmt = connection.prepareStatement("UPDATE users SET balance = balance - ? WHERE card_id = ?");
        updateBalanceStmt.setDouble(1, amount);
        updateBalanceStmt.setString(2, cardId);
        updateBalanceStmt.executeUpdate();
        PreparedStatement updateTargetBalanceStmt = connection.prepareStatement("UPDATE users SET balance = balance + ? WHERE card_id = ?");
        updateTargetBalanceStmt.setDouble(1, amount);
        updateTargetBalanceStmt.setString(2, targetCardId);
        updateTargetBalanceStmt.executeUpdate();
        System.out.printf("转账成功,当前余额为:%.2f\n", currentBalance - amount);
    } else {
        System.out.println("余额不足!");
    }
} else {
    System.out.println("目标账户不存在!");
}

修改密码

修改密码需要输入旧密码和新密码两次,并进行检查后更新密码。

// 判断旧密码是否正确
PreparedStatement checkPasswordStmt = connection.prepareStatement("SELECT * FROM users WHERE card_id = ? AND password = ?");
checkPasswordStmt.setString(1, cardId);
checkPasswordStmt.setString(2, oldPassword);
ResultSet resultSet = checkPasswordStmt.executeQuery();
if (resultSet.next()) {
    // 更新密码
    PreparedStatement updatePasswordStmt = connection.prepareStatement("UPDATE users SET password = ? WHERE card_id = ?");
    updatePasswordStmt.setString(1, newPassword);
    updatePasswordStmt.setString(2, cardId);
    updatePasswordStmt.executeUpdate();
    System.out.println("密码修改成功!");
} else {
    System.out.println("旧密码错误!");
}

退出

退出功能仅需跳出 ATM 功能即可。

System.exit(0);

示例代码

查询所有用户信息

Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/atm?useSSL=false&characterEncoding=utf-8";
String username = "root";
String password = "123456";
Connection connection = DriverManager.getConnection(url, username, password);

Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery("SELECT * FROM users");
while (resultSet.next()) {
    int id = resultSet.getInt("id");
    String cardId = resultSet.getString("card_id");
    String password = resultSet.getString("password");
    double balance = resultSet.getDouble("balance");
    System.out.printf("ID:%d,卡号:%s,密码:%s,余额:%.2f\n", id, cardId, password, balance);
}

resultSet.close();
statement.close();
connection.close();

查找银行卡号为 1 的用户信息

Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/atm?useSSL=false&characterEncoding=utf-8";
String username = "root";
String password = "123456";
Connection connection = DriverManager.getConnection(url, username, password);

PreparedStatement statement = connection.prepareStatement("SELECT * FROM users WHERE id = ?");
statement.setInt(1, 1);
ResultSet resultSet = statement.executeQuery();
if (resultSet.next()) {
    int id = resultSet.getInt("id");
    String cardId = resultSet.getString("card_id");
    String password = resultSet.getString("password");
    double balance = resultSet.getDouble("balance");
    System.out.printf("ID:%d,卡号:%s,密码:%s,余额:%.2f\n", id, cardId, password, balance);
} else {
    System.out.println("没有该用户!");
}

resultSet.close();
statement.close();
connection.close();

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java模拟ATM功能(控制台连接Mysql数据库) - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • 详解Java的文件与目录管理以及输入输出相关操作

    当我们在使用 Java 进行编程的时候,经常需要对文件与目录进行管理,同时也需要进行输入输出操作。这里针对这几个主题进行详细的讲解。 Java 的文件与目录管理 Java 提供了两个类来进行文件操作,分别是 File 和 Path。File 类代表了文件或者目录的路径,可以用来创建、查找、删除和重命名文件和目录,Path 类则将文件和目录的路径以文件系统无关…

    Java 2023年5月20日
    00
  • java 实现KMP算法

    Java实现KMP算法完整攻略 什么是KMP算法 KMP算法全称是Knuth-Morris-Pratt算法,是一个字符串查找算法,用于在一个字符串S中查找一个模式串P出现的位置。 KMP算法思想 KMP算法的思想是通过一个”部分匹配”的概念,当部分匹配发生后,可以知道一部分字符是匹配的,从而充分利用这个已知信息,避免从头再去比较已经比较过的字符。 KMP算法…

    Java 2023年5月18日
    00
  • SpringBoot整合Spring Security的详细教程

    SpringBoot整合SpringSecurity的详细教程 Spring Security是Spring框架家族中的一员,是基于Spring的实现了安全控制的框架。 SpringBoot是一个快速开发的框架,整合SpringSecurity可以让开发者快速实现安全控制功能。 下面我们一步步的来学习如何在SpringBoot中整合SpringSecurit…

    Java 2023年5月15日
    00
  • Spring Security基于数据库实现认证过程解析

    下面我将为您讲解Spring Security基于数据库实现认证过程的详细攻略,包含以下几个方面: 理解Spring Security的基本概念 使用Spring Security的主要步骤和流程 基于数据库实现Spring Security的认证过程 1. 理解Spring Security的基本概念 Spring Security是一个被广泛使用的Jav…

    Java 2023年5月20日
    00
  • 详解Java网络编程

    详解Java网络编程攻略 Java网络编程是Java中一门非常重要的技术,它不仅可以将不同主机之间的计算机网络互联互通,而且也是构建各种服务器端应用程序的重要基础。下面我们将对Java网络编程进行一个详细的讲解,希望能够帮助读者更好地了解Java网络编程。 Java网络编程概述 Java网络编程是Java提供的一组功能强大的API,这些API可以让我们轻松地…

    Java 2023年5月19日
    00
  • 一文带你深入剖析Java线程池的前世今生

    一文带你深入剖析Java线程池的前世今生 前言 在多线程编程中,合理使用线程池可以非常有效地提高系统的性能和稳定性。Java线程池作为Java提供的重要多线程协调工具,在实际开发中备受青睐。本文将从Java线程池的定义、类型、工作原理、使用场景以及常见误区等方面进行深入分析和讲解,帮助Java初学者和进阶者更好地掌握线程池的使用。 定义 Java线程池本质上…

    Java 2023年5月24日
    00
  • Spring Security认证器实现过程详解

    Spring Security认证器实现过程详解 什么是Spring Security认证器 Spring Security是一个基于安全框架的安全性认证和授权框架,也是Spring框架中的一个子项目。它负责管理我们应用程序中的用户、角色和权限,并为它们提供安全访问。 Spring Security身份认证的实现过程主要涉及到AuthenticationMa…

    Java 2023年5月20日
    00
  • Java执行JavaScript代码

    下面是Java执行JavaScript代码的完整攻略,包含两条示例说明。 1. 前置知识 在执行JavaScript代码前,需要先了解几个概念: 版本:Java需要使用1.7及以上版本才能支持JavaScript 引擎:Java中通常使用Rhino或Nashorn引擎执行JavaScript代码 接口:Java提供了脚本引擎接口,用于在Java中执行Java…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部