JAVA实验3:Java-MySQL实现银行转账系统

news/2024/5/19 0:21:10 标签: 数据库, mysql, jdbc, java

运行结果

实验中解决了用户登录时SQL注入问题,提高了系统的安全性
并且关闭了事务自动提交,开启了事务回滚功能,保证了用户资金的安全性
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

PowerDesigner16.5建模

在这里插入图片描述

数据库源码

drop table if exists userlogin;

/*==============================================================*/
/* Table: userlogin                                             */
/*==============================================================*/
create table userlogin
(
   username             varchar(20) not null,
   password             varchar(20),
   primary key (username)
);

drop table if exists userstate;

/*==============================================================*/
/* Table: userstate                                             */
/*==============================================================*/
create table userstate
(
   username             varchar(20) not null,
   money                bigint,
   primary key (username)
);

insert into userlogin(username,password) values('zrs','333');
insert into userlogin(username,password) values('llf','222');
insert into userstate(username,money) values('zrs',20000);
insert into userstate(username,money) values('llf',0);

java_46">使用的java模块

在这里插入图片描述

java_50">java源码

Bank主函数入口:

java">package Bank;

import Mysql.Mysql;
import InitUI.InitUI;
import TransfroUI.*;
import UserLogin.UserLogin;
import java.sql.*;
import java.util.Map;

public class Bank {
    public static void main(String[] args){
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;

        try{
            conn = Mysql.connection("bank");
            Map<String,String> map = InitUI.initUI();
            String uname = map.get("username");
            String pwd = map.get("password");
            UserLogin.userLogin(uname,pwd,conn);

            conn.setAutoCommit(false);
            transfor(uname,conn);
            conn.commit();

        }catch(SQLException e){
            if(conn != null){
                try{
                    conn.rollback();
                    System.out.println("事务回滚");
                }catch(Exception a){
                    a.printStackTrace();;
                }
            }
            e.printStackTrace();
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            Mysql.close(conn,pstmt,rs);
        }
    }

    private static void transfor(String uname,Connection conn) throws SQLException{
        Map<String,String> trans = TransforUI.transforUI();
        String tname = trans.get("transforname");
        String money = trans.get("money");
        String[] sql = {"update userstate set money = money+? where username = ?;",
                        "update userstate set money = money-? where username = ?",
                        "select money from userstate where username = ?"};
        PreparedStatement pstmt_0 = conn.prepareStatement(sql[0]);
        PreparedStatement pstmt_1 = conn.prepareStatement(sql[1]);
        PreparedStatement pstmt_2 = conn.prepareStatement(sql[2]);
        pstmt_0.setString(1,money);
        pstmt_0.setString(2,tname);
        pstmt_1.setString(1,money);
        pstmt_1.setString(2,uname);
        pstmt_2.setString(1,uname);
        int count = pstmt_0.executeUpdate();
        count += pstmt_1.executeUpdate();
        ResultSet rs = pstmt_2.executeQuery();
        rs.next();
        if(count==2 && rs.getInt("money")>=0){
            System.out.println("转账成功");
        }else{
            System.out.println("余额不足");
            throw new SQLException();
        }
    }
}

Mysql封装源码:

java">package Mysql;

import java.sql.*;

public class Mysql{
    private Mysql(){}

    //注册驱动
    static{
        try{
            Class.forName("com.mysql.cj.jdbc.Driver");
        }catch(Exception e){
            e.printStackTrace();
        }
    }

    //连接数据库
    public static Connection connection(String database_name) throws Exception{
        return DriverManager.getConnection("jdbc:mysql://localhost:3306/"+database_name,
                                                "root","feifei123");
    }

    //释放资源
    public static void close(Connection conn, PreparedStatement pstmt){
        if(pstmt != null){
            try{
                pstmt.close();
            }catch(SQLException e){
                e.printStackTrace();
            }
        }
        if(conn != null){
            try{
                conn.close();
            }catch(SQLException e){
                e.printStackTrace();
            }
        }
    }

    //重载释放资源方法
    public static void close(Connection conn,PreparedStatement pstmt,ResultSet rs){
        if(rs != null){
            try{
                rs.close();
            }catch(SQLException e){
                e.printStackTrace();
            }
        }
        if(pstmt != null){
            try{
                pstmt.close();
            }catch(SQLException e){
                e.printStackTrace();
            }
        }
        if(conn != null){
            try{
                conn.close();
            }catch(SQLException e){
                e.printStackTrace();
            }
        }
    }
}

用户输入模块源码:

java">package InitUI;

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class InitUI {
    private InitUI(){}

    public static Map<String, String> initUI() {
        Map<String,String> map = new HashMap();
        Scanner s = new Scanner(System.in);
        System.out.println("请输入用户名:");
        String username = s.next();
        System.out.println("请输入密码:");
        String password = s.next();
        map.put("username",username);
        map.put("password",password);
        return map;
    }
}

用户登录检测源码:

java">package UserLogin;

import java.sql.*;
import java.sql.SQLException;
import java.util.Map;
import java.util.ResourceBundle;


public class UserLogin {
    private UserLogin(){}

    public static void userLogin(String username, String password,Connection conn) throws Exception{
        String sql = "select * from userlogin where username = ? and password = ?;";
        PreparedStatement pstmt = conn.prepareStatement(sql);
        pstmt.setString(1,username);
        pstmt.setString(2,password);

        ResultSet rs = pstmt.executeQuery();
        boolean flag = rs.next()==true?true:false;
        if(flag){
            System.out.println(username+"欢迎回来");
        }else{
            System.out.println("登录失败,请重新登录");
            Map<String,String> map =InitUI.InitUI.initUI();
            String uname = map.get("username");
            String pwd = map.get("password");
            userLogin(uname,pwd,conn);
        }
    }
}

用户转账检测源码:

java">package TransfroUI;

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class TransforUI {
    private TransforUI(){}

    public static Map<String, String> transforUI() {
        Map<String,String> map = new HashMap();
        Scanner s = new Scanner(System.in);
        System.out.println("请输入要转账的用户名:");
        String username = s.next();
        System.out.println("请输入要转账的金额:");
        String password = s.next();
        map.put("transforname",username);
        map.put("money",password);
        return map;
    }
}


http://www.niftyadmin.cn/n/1731679.html

相关文章

python 虚拟环境_Python全栈开发,如何使用Python的虚拟环境

1.6 python虚拟环境1.6.1 为什么需要虚拟环境一个Python项目的结构&#xff0c;如下图&#xff1a;一个Python项目的结构虚拟环境好处&#xff1a;在开发中很多时候不同的项目会需要用的不同版本的包&#xff0c;甚至是不同版本的Python&#xff0c;而使用虚拟环境就可以轻松解…

多种功能指纹锁方案解析介绍,智能指纹锁方案开发

一、指纹解锁功能、虚伪密码功能、刷卡解锁功能。      在这个指纹锁方案里&#xff0c;可以通过录入指纹&#xff0c;指纹识别开锁的同时&#xff0c;可以设定虚拟密码&#xff0c;通过密码解锁&#xff1b;还可以配置智能门锁卡来开门&#xff0c;这样多功能主要是可以根…

Felomeng翻译:libsvm2.88之实际使用中的技巧

数值化你的数据。例如&#xff0c;将所有的属性用区间[0,1]或[-1,1]中的数值表示。 *使用C-SVC模型时&#xff0c;可以考虑选用“tools”文件夹中的模型选择工具。 *在nu-SVC/one-class-SVM/nu-SVR模型中的nu参数接近训练错误和支持向量的商。 *如果分类的目标数据是不均衡的…

嵌入式指纹识别指纹智能锁方案开发设计

信息化时代&#xff0c;生物识别技术作为信息安全和个人身份识别技术越来越受到人们的重视。指纹作为人体中最明显的外表特征&#xff0c;具有唯一性、终身不变性、易获取、难以复制等优点。随着科学技术的发展&#xff0c;指纹识别已经成为目前最为实用、应用最为广泛的生物识…

Felomeng翻译:libsvm2.88之“svm-scale”的使用

语法&#xff1a;svm-scale [参数表] 数据文件 参数&#xff1a; -l 下限&#xff1a;x坐标数值化最低下限&#xff08;默认值-1&#xff09; -u 上限&#xff1a;x坐标数值化最高上限&#xff08;默认值1&#xff09; -y y_lower y_upper&#xff1a;y坐标数值化区间&…

Felomeng翻译:libsvm2.88之“svm-train”的使用

语法&#xff1a;svm-train [参数表] 训练数据集文件 [模型文件] 参数&#xff1a; -s 支持向量机类型&#xff1a;支持向量机类型集合&#xff08;默认值0&#xff09; 0 -- C-SVC 1 -- nu-SVC 2 -- one-class SVM 3 -- epsilon-SVR 4 -- nu-SVR -t 内核类型&#xff1a;内…

智能锁方案 酒店家用指纹锁解决方案

智能锁是指区别于传统机械锁&#xff0c;在用户识别、安全性、管理性方面更加智能化的锁具。门禁系统中锁门的执行部件。在安全技术防范领域&#xff0c;具有防盗报警功能的电子密码锁代替传统的机械式密码锁&#xff0c;克服了机械式密码锁密码量少、安全性能差的缺点&#xf…

共享单车智能锁方案的优劣势

作为用户&#xff0c;我们都体验过共享单车的开锁方式:用手机扫描车上的二维码&#xff0c;APP上出现解锁进度的读条&#xff0c;10秒内就会听到电机带动和锁鞘“啪”的一声&#xff0c;解锁成功。      但是实质上&#xff0c;共享单车的智能锁方案从上线之初到现今&#…