用java和JDBC实现一个ATM机系统(2.1版)

用java和JDBC实现一个ATM机系统(2.1版)

java和数据库实现银行ATM自助取款机,实现功能:用户登录、余额查询、存钱、取钱、转账、修改密码、退出系统。

设计思路

设计六个类包括测试类:
1,ATM类也是主要的类,负责实现用户一系列的操作;
2,Data类,操作数据库的类,作为ATM类的一个属性,主要实现从数据库获取用户信息,并完成数据的更新;
3、JDBCUtil类,JDBC工具类,注册mysql驱动、获取连接对象及释放资源;
4,Bank类,有ATM机(has-a),欢迎用户来使用ATM机;
5,User类,使用ATM机(use-a);
6,Demo类,测试类,创建一个环境,让类产生关系。

源代码

导入mysql驱动的jar包,还需要一个配置文件

需要导入mysql驱动的jar包:
先创建一个libs文件夹,将mysql驱动的jar包复制到这个文件中,然后右键,点击Add as …
在这里插入图片描述
直接在src文件夹下创建jdbc.properties配置文件;
文件内容:
//atm是创建的数据库名称

url=jdbc:mysql://localhost:3306/atm
user=你的mysql的用户名
password=你的mysql用户密码
driver=com.mysql.jdbc.Driver

ATM 类

package atm;

import java.util.Scanner;

//ATM类
public class ATM {
    //有一个类操作数据的类
    private Data data = new Data();
    //ATM机里的数据
    private double userMoney;//用户账户里的钱
    private double money;//变量,存,取,转账的钱

    //ATM界面
    public void show(){
        System.out.println("欢迎使用ATM机");
        //使用登录方法,输入账号和密码
        int number = login();
        //如果登录成功
        if(number == 4)
            working();//ATM机办理业务

    }
    //登录方法
    private int login(){
        int number = 3;//用户输入次数
        while(number > 0) {
            Scanner input = new Scanner(System.in);
            System.out.println("请输入账号:");
            //输入账号
            String inUserName = input.nextLine();
            //输入密码
            System.out.println("请输入密码:");
            String inUserPassword = input.nextLine();
            //验证
            if(data.isTrue(inUserName,inUserPassword)){
                userMoney = data.getMoney();
                System.out.println("登录成功");
                number = 4;//次数变为4
                break;
            }
            number --;//次数减一
            System.out.println("账号或密码输入错误。。。");
            System.out.println("您还有" + number + "次机会");
        }
        return number;//是否登录成功
    }

    //功能界面
    private void functionShow(){
        System.out.println("**********************");
        System.out.println("\t欢迎使用ATM");
        System.out.println("1,账户余额查询\n2,存钱\n3,取钱\n4,转账\n5,修改用户密码\n6,退出系统\n");
        System.out.println("**********************");
    }

    //用户要进行的操作
    private void working(){
        String index;//业务序号
        do{
            functionShow();//调用功能界面
            System.out.println("请输入要办理的业务序号:");
            Scanner input = new Scanner(System.in);
            index = input.nextLine();
            switch(index){
                case "1":
                    look();
                    break;
                case "2":
                    saveMoney();
                    break;
                case "3":
                    getMoney();
                    break;
                case "4":
                    giveMoney();
                    break;
                case "5":
                    changePassword();
                    break;
                case "6":
                    System.out.println("欢迎下次光临!");
                    data.close();
                    break;
                default:
                    System.out.println("您输入有误,请重新输入。。。。");
            }
        }while(!index.equals("6"));
    }

    //是否继续某项操作
    private boolean isContinue(){
        System.out.println("继续办理该项业务:请输入Y/y");
        System.out.println("返回上一级:请输入N/n");
        Scanner input = new Scanner(System.in);
        String str = input.nextLine();
        if(str.equalsIgnoreCase("Y"))
            return true;
        else
            return false;
    }

    //存钱,取钱,转账共用
    private void howMuch(String str){
        System.out.println("欢迎办理"+ str +"业务。。。。。。");
        System.out.println("请输入金额(只能是整数且是100的倍数,最多为10000):");
        Scanner input = new Scanner(System.in);
        Double money = input.nextDouble();
        if(money%10 != 0) {
            System.out.println("您输入有误!");
            this.money = 0;
        }
        else
            this.money = money;
    }

    //查询实现
    private void look(){
        userMoney = data.getMoney();
        System.out.println("用户余额为:" + userMoney);
        try{
            Thread.sleep(2000);
        }catch(Exception e){
            e.printStackTrace();
        }
    }

    //存钱实现
    private void saveMoney(){
        howMuch("存钱");
        if(money != 0) {//如果存的钱正确
            boolean a = data.changeMoney(money, true);//存上
            if(a)
                System.out.println("已存入");
            look();//显示余额
        }
        if(isContinue())
            saveMoney();
    }

    //判断余额是否充足
    private boolean isEnough(){
        userMoney = data.getMoney();
        if(money <= userMoney)
            return true;
        else{
            System.out.println("您的余额不足!");
            return false;
        }
    }

    //取钱实现
    private void getMoney(){
        howMuch("取钱");
        //如果取的钱正确且如果转账账户余额够
        if(money != 0 && isEnough()){
            data.changeMoney(money, false);
            look();
            System.out.println("请收好您的钱");
        }
        if(isContinue())
            getMoney();
    }

    //转账实现
    private void giveMoney(){
        //只判断用户账户是否存在
        Scanner input = new Scanner(System.in);
        System.out.println("请输入要转账账号:");
        //输入账号
        String inUserName = input.nextLine();
        //如果该账户存在
        if(data.isUser(inUserName)) {
            howMuch("转账");
            //如果转的钱正确且如果转账账户余额够
            if (money != 0 && isEnough()) {
                data.giveMoney(money);
                System.out.println("转账成功");
                look();
            }
        }
        else
            System.out.println("被转账账户不存在。。。");
        if(isContinue())
            giveMoney();
    }

    //修改密码实现
    private void changePassword(){
        System.out.println("请输入新密码:");
        Scanner input = new Scanner(System.in);
        String newPassword = input.nextLine();
        boolean b = data.changePassword(newPassword);
        if(b)
            System.out.println("密码修改成功!");
        else
            System.out.println("密码修改失败!");
    }
}

Data类

package atm;

import jdbc_util.JDBCUtil;

import java.sql.*;

public class Data {

    private double umoney;//用户余额
    private String uname; //用户
    private String gname;  //被转账用户
    private Connection coon = null;//连接对象,程序结束时释放
    private PreparedStatement pstmt = null;
    private ResultSet res = null;
    private String sql;//sql语句

    {
        try {
            coon = JDBCUtil.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取该账户的余额
     * @return 余额
     */
    public double getMoney(){
        try {
            sql = "select * from atm where uname= ?";//查询语句
            pstmt = coon.prepareStatement(sql);
            pstmt.setString(1, uname);
            res = pstmt.executeQuery();
            if(res.next()){
                umoney = res.getDouble("money");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JDBCUtil.close(res, pstmt, null);//释放资源
        }
        return umoney;
    }

    /**
     * 判断登录是否成功
     */
    public boolean isTrue(String user,String password){
        if(user == null || password == null){
            return false;
        }
        try {
            sql = "select * from atm where uname = ? and password = ?";
            pstmt = coon.prepareStatement(sql);
            pstmt.setString(1,user);
            pstmt.setString(2,password);
            res = pstmt.executeQuery();
            uname = user;
            return res.next();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            JDBCUtil.close(res, pstmt, null);
        }
        return false;
    }

    /**
     * 判断被转帐用户是否存在
     * @param user 被转账用户名
     * @return
     */
    public boolean isUser(String user){
        if(user == null){
            return false;
        }
        try {
            sql = "select * from atm where uname = ?";
            pstmt = coon.prepareStatement(sql);
            pstmt.setString(1,user);
            res = pstmt.executeQuery();
            gname = user;
            return res.next();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            JDBCUtil.close(res, pstmt, null);
        }
        return false;
    }

    /**
     * 取钱、存钱操作
     * @param money 钱数
     * @param isOrNot 存钱or取钱
     */
    public boolean changeMoney(double money,boolean isOrNot){
        if(isOrNot){
            sql = "update atm set money = money + ? where uname = ?";
        }else{
            sql = "update atm set money = money - ? where uname = ?";
        }
        return runSql(money,null);
    }

    /**
     * 修改密码
     * @param newPassword 新密码
     * @return
     */
    public boolean changePassword(String newPassword){
        if(newPassword == null){
            return false;
        }
        sql = "update atm set password = ? where uname = ?";
        return runSql(0,newPassword);
    }

    //执行sql修改操作
    private boolean runSql(double money,String newPassword){
        try {
            if(sql == null){
                return false;
            }
            pstmt = coon.prepareStatement(sql);
            if(newPassword == null){
                pstmt.setDouble(1, money);
            }else{
                pstmt.setString(1, newPassword);
            }
            pstmt.setString(2,uname);
            int count = pstmt.executeUpdate();
            if(count != 0){
                return true;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            sql = null;
            JDBCUtil.close(res, pstmt, null);
        }
        return false;
    }

    /**
     * 转账操作,事务
     * @param money 转账数
     * @return
     */
    public boolean giveMoney(double money){
        PreparedStatement pstmt1 = null;
        try {
            coon.setAutoCommit(false); //开启事务
            sql = "update atm set money = money - ? where uname = ?";
            String sql1 = "update atm set money = money + ? where uname = ?";
            pstmt = coon.prepareStatement(sql);
            pstmt1 = coon.prepareStatement(sql1);
            pstmt.setDouble(1,money);
            pstmt.setString(2,uname);
            pstmt1.setDouble(1,money);
            pstmt1.setString(2,gname);
            int a = pstmt.executeUpdate();
            int b = pstmt1.executeUpdate();
            coon.commit();//提交事务
            if(a !=0 && b!=0) {
                return true;
            }
        } catch (Exception e) {
            try {
                if(coon !=null)
                    coon.rollback();//回滚
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
            e.printStackTrace();
        }finally{
            JDBCUtil.close(res, pstmt, null);
            JDBCUtil.close(null, pstmt1, null);
        }
        return false;
    }

    /**
     * 释放所有的资源
     */
    public void close(){
        JDBCUtil.close(res, pstmt, coon);
    }

}

JDBC工具类

package jdbc_util;

import com.sun.org.apache.bcel.internal.util.ClassLoader;

import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.sql.*;
import java.util.Properties;

/**
 * JDBC工具类
 */
public class JDBCUtil {

    private static String url;
    private static String user;
    private static String password;
    private static String driver;

    /**
     * 从配置文件读取所需要的数据
     */
    static{
        try {
            //创建Properties集合类
            Properties pro = new Properties();
            //获取src下文件路径---->ClassLoader 类加载器(文件路径不有为中文)
            ClassLoader classLoader = new ClassLoader();
            URL res = classLoader.getResource("jdbc.properties");
            String path = res.getPath();
            //加载文件
            //pro.load(new FileReader("/D:/java-idea2018File/jdbc/out/production/atm-gui-jdbc/jdbc.properties"));
            pro.load(new FileReader(path));
            //获取数据赋值
            url = pro.getProperty("url");
            user = pro.getProperty("user");
            password = pro.getProperty("password");
            driver = pro.getProperty("driver");

            //注册驱动
            Class.forName(driver);

        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取连接
     * @return 连接对象
     */
    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(url,user,password);
    }

    /**
     * 释放资源
     * @param stmt
     * @param coon
     */
    public static void close(Statement stmt, Connection coon){
        close(null,stmt,coon);
    }

    public static void close(ResultSet res,Statement stmt,Connection coon){
        if(res != null){
            try{
                res.close();
            }catch (SQLException e){
                e.printStackTrace();
            }
        }
        if (stmt != null) {
            try{
                stmt.close();
            }catch (SQLException e){
                e.printStackTrace();
            }
        }
        if (coon != null) {
            try{
                coon.close();
            }catch (SQLException e){
                e.printStackTrace();
            }
        }
    }

}

Bank类

package atm;

//银行类
public class Bank {
    //银行有ATM机供给用户使用
    private ATM atm = new ATM();
    //欢迎用户使用
    public void welcome(User user){
        System.out.println("欢迎用户来我行使用ATM机");
        user.useATM(atm);
    }

}


User类

package atm;

//用户类
public class User {
    //用户使用ATM机办理业务
    public void useATM(ATM atm){
        atm.show();
    }
}

Demo测试类

package atm;

//测试类
public class Demo {

    public static void main(String[] args){
        //创建一个银行
        Bank bank = new Bank();
        //创建一个用户
        User user = new User();
        //银行欢迎用户
        bank.welcome(user);
    }
}

mysql代码


CREATE DATABASE atm;
CREATE TABLE atm(
	id INT PRIMARY KEY AUTO_INCREMENT,
	uname VARCHAR(30),
	PASSWORD VARCHAR(6),
	money DOUBLE(6,2)
);

INSERT INTO atm(id,uname,PASSWORD,money)  VALUES(
	NULL,
	'张三',
	'123',
	0
);

INSERT INTO atm(id,uname,PASSWORD,money)  VALUES(
	NULL,
	'李四',
	'456',
	0
);

INSERT INTO atm(id,uname,PASSWORD,money)  VALUES(
	NULL,
	'王五',
	'789',
	0
);

SELECT * FROM atm;

运行结果:
在这里插入图片描述

  • 2
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不不树

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值