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中年月日的加减法使用示例”的完整攻略: 一、通过Calendar类进行加减法计算 Calendar是Java平台中操作日历时间的类,它提供了丰富的设置、获取、增减和处理年月日等操作方法。下面提供两个示例代码,分别用于实现“加上一年”和“减去两个月”的功能: 1. 加上一年 Calendar calendar = Calendar.getIns…

    Java 2023年5月20日
    00
  • 浅谈SpringBoot之事务处理机制

    浅谈SpringBoot之事务处理机制 什么是事务? 事务是指一系列数据库操作(insert、update、delete等),要么全部完成,要么全部回滚,如果其中任何一个操作失败,整个事务将回滚到起点。 在Spring Boot中,可以使用@Transactional注解来声明一个事务,这样在方法执行时就会被视为一个事务,并启用该方法中的所有数据库操作,这个…

    Java 2023年5月15日
    00
  • java LeetCode刷题稍有难度的贪心构造算法

    Java LeetCode刷题稍有难度的贪心构造算法攻略 在LeetCode刷题过程中,贪心算法在构造类问题中经常发挥着非常强大的作用。本篇文章将介绍贪心构造算法的基本思想和常见的实现模式,并给出两个例题作为说明。 概述 贪心构造算法指的是在求解最优解的过程中,每一步都采取当前状态下最优的选择。该算法通常适用于满足贪心选择性质的问题中,即问题能够分解成若干个…

    Java 2023年5月26日
    00
  • Struts2拦截器Interceptor的原理与配置实例详解

    Struts2拦截器Interceptor的原理 什么是Interceptor Interceptor拦截器,在Struts中负责拦截请求并且在Action处理请求之前或之后进行一系列的自定义操作,常用于日志记录、权限验证、性能监控等方面。 Interceptor的配置与执行 Interceptor的配置主要有两个步骤: 1.在struts.xml中进行声明…

    Java 2023年5月20日
    00
  • java常用工具类之DES和Base64加密解密类

    下面我将为您详细讲解“java常用工具类之DES和Base64加密解密类”的完整攻略。 1. 什么是DES和Base64加密解密算法 DES是一种对称加密算法,全称为数据加密标准(Data Encryption Standard),在安全性和效率方面都有不错的表现。而Base64是流行的编码方式,不是一种加密方式。它可以将任意字节序列编码成一种可用于文本通信…

    Java 2023年5月20日
    00
  • vue 封装面包屑组件教程

    首先我们来介绍一下什么是面包屑(Breadcrumb)组件。面包屑组件是一种常用的导航方式,它能够让用户清楚地知道自己当前所处的位置以及所访问的路径。在前端框架中,Vue也提供了非常方便的封装方式来实现面包屑组件。 接下来,我们将按照以下步骤进行Vue面包屑组件的封装: 1. 创建面包屑组件 首先,在Vue项目中创建一个面包屑组件,它的基本结构如下: &lt…

    Java 2023年5月20日
    00
  • 详解Java中的数组与字符串相关知识

    详解Java中的数组与字符串相关知识 数组 定义 数组是一种用来存储同类型元素集合的数据结构,在Java中通过[]符号定义一个数组。 示例: int[] numbers = new int[5]; 上面的代码定义了一个长度为5的整型数组。 访问 通过下标访问数组元素,下标从0开始,可以直接访问数组元素,也可以遍历数组访问每个元素。 示例: int[] num…

    Java 2023年5月26日
    00
  • 微信小程序实现IP归属地获取功能

    下面是“微信小程序实现IP归属地获取功能”的详细攻略。 1. 获取IP地址 在微信小程序中,我们可以通过wx.request()方法来获取当前客户端的IP地址。代码示例如下: wx.request({ url: ‘https://pv.sohu.com/cityjson?ie=utf-8’, // 这是一个返回客户端IP地址及归属地的接口 success(r…

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