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日

相关文章

  • Spring Security十分钟入门教程

    Spring Security 十分钟入门教程 Spring Security 是一个基于 Spring 框架的安全框架,能够为 web 应用程序提供身份验证和授权的支持。 开始之前 在开始学习之前,需要具备以下知识: Spring 框架基础 Maven 项目管理工具 Spring Boot 基础知识 步骤 步骤一:创建一个 Spring Boot Web …

    Java 2023年6月3日
    00
  • IDEA中Maven依赖下载失败的完美解决方案

    下面是“IDEA中Maven依赖下载失败的完美解决方案”的攻略。 问题描述 在使用Maven构建项目时,可能会遇到依赖下载失败的情况。这时IDEA上会报错,指出找不到相应的依赖。通常遇到这种情况可以有如下的处理方法: 方法一:手动清除本地Maven缓存 在本地Maven仓库里清除缓存,然后重新构建项目即可。清除缓存的方法如下: mvn dependency:…

    Java 2023年5月20日
    00
  • 实例解析Java的Jackson库中的数据绑定

    实例解析Java的Jackson库中的数据绑定 Jackson是Java平台领先的开源JSON(JavaScript Object Notation)处理库,它有着出色的性能和易用性,并且支持流式解析和生成JSON数据。Jackson提供了诸如JsonNode、ObjectMapper、ObjectReader、ObjectWriter等API来处理JSON…

    Java 2023年5月26日
    00
  • 并行收集器的作用是什么?

    并行收集器是JVM中的一种垃圾收集器,它会利用多个CPU核心同时进行垃圾收集,以提高垃圾收集的效率和性能。下面我们来详细讲解并行收集器的作用及使用攻略。 并行收集器的作用 并行收集器主要用于大规模的应用程序或者需要执行大量的垃圾收集操作的应用程序,它的主要作用是在垃圾收集时利用多个CPU核心来加速垃圾收集的过程,从而减少应用程序因垃圾回收而被阻塞的时间。同时…

    Java 2023年5月10日
    00
  • Java基础知识之ByteArrayOutputStream流的使用

    Java基础知识之ByteArrayOutputStream流的使用 ByteArrayOutputStream简介 Java I/O系统提供了许多不同类型的流,其中 ByteArrayOutputStream 是一个内存流,它将数据写入到内存缓冲区中而不是写入到硬盘中。它实际上是一个基于字节数组的输出/输入流,它可以动态扩展。 使用 ByteArrayOu…

    Java 2023年5月26日
    00
  • JSP中response.setContentType和response.setCharacterEncoding区别分析

    当我们在JSP中使用response对象时,有两个方法可以设置响应报文的内容类型和字符编码,这就是response.setContentType和response.setCharacterEncoding两者的作用。 response.setContentType response.setContentType方法用于设置响应报文的MIME类型。MIME类型…

    Java 2023年6月15日
    00
  • 基于ajax实现文件上传并显示进度条

    下面是基于ajax实现文件上传并显示进度条的完整攻略: 1. 准备工作 在前端实现基于ajax的文件上传需要以下几个工具/库: FormData对象:用于创建一个表单数据对象,方便把文件和其他数据打包发送到服务器端。 XMLHttpRequest对象:用于创建异步请求,可以通过它向服务器端发送数据。 FileReader对象:用于读取本地文件并把它转换成ba…

    Java 2023年5月20日
    00
  • Java双冒号(::)运算符使用详解

    Java双冒号(::)运算符使用详解 什么是Java双冒号(::)运算符? Java 8 引入了一种新的运算符double colon (::),也称为双冒号运算符。它可以用在方法或构造函数的引用上,类似于Lambda表达式。 Java双冒号运算符被用来取代Lambda表达式,因为它们比Lambda表达式更加简洁。同时,使用双冒号运算符也会带来更好的性能。 …

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