欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java用数据库实现一个简单的ATM机的案例,由Connection连接对象产生预编译处理对象PreparedStatement,可以防止sql的注入

程序员文章站 2022-06-05 08:57:53
...

java用数据库实现一个简单的ATM机的案例,由Connection连接对象产生预编译处理对象PreparedStatement,可以防止sql的注入。
先学会爬,再学走!

import java.sql.*;
import java.util.Scanner;

public class Atm {

	public static void main(String[] args) throws SQLException 
	{
		//数据库名Atm    表名:atmpre (表内结构有:pre_id pre_name  pre_idcard  pre_password money) 
		String str="com.mysql.jdbc.Driver";
		Connection con=null;
		ResultSet rs=null;
		String url="jdbc:mysql://localhost:3306/Atm";
		String user="root";
		String password="root";
		Statement stmt=null;
		PreparedStatement psmt=null;
		Scanner sc=new Scanner(System.in);
		int count=0;
		try 
		{
			Class.forName(str);//加载驱动,初始化Diver这个类的作用
			con=DriverManager.getConnection(url, user, password);//注册驱动
			//stmt=con.createStatement();添加测试项
			//stmt.executeUpdate("insert into Atmpre values(1001,'user','123456','123456',10000)");//添加一个测试用户
			System.out.println("欢迎使用");
			String idcard;
			String pwd;
			while(true)
			{
				System.out.println("请输入账号");
				idcard=sc.next();
				System.out.println("请输入密码");
				pwd=sc.next();
				String sql="select * from Atmpre where pre_idcard=? and pre_password=?";//?就是占位符,预编译要先开辟一块缓存,用?来占位,这就是放加注的原因
				psmt=con.prepareStatement(sql);//发送sql语句的方法(预编译的原理就是先发送,形成缓存,然后在用带实参的执行语句执行)
				psmt.setString(1, idcard);
				psmt.setString(2, pwd);
				rs=psmt.executeQuery();//执行sql语句的方法
				if(rs.next())
				{
					break;
				}
				else
				{
					count++;
					if(count==3)
					{
						System.out.println("输入错误次数,卡已吞,请到柜台!");
			    		System.exit(0);
					}
					else
					{
						System.out.println("输入错误,请重新输入!");
					}
				}
			}
			System.out.println("请选择操作:1、取款 2、查询余额 3、转账 4、存款 5、修改密码");
			int a=sc.nextInt();
			switch(a)
			{
			case 1://1、取款 
					System.out.println("请输入取款的数目");
					int b=sc.nextInt();
					String b1="select pre_money from Atmpre where pre_idcard=?";
					psmt=con.prepareStatement(b1);
					psmt.setString(1, idcard);
					rs=psmt.executeQuery();
					int money=0;
					while(rs.next())
					{
						money=rs.getInt("pre_money");
					}
					if (b>money)
					{
						System.out.println("余额不足!请充值再取");
					}
					else
					{
						String str1="update  atmpre  set pre_money=pre_money-'"+b+"'where pre_idcard='"+idcard+"'";
						psmt.executeUpdate(str1);
						System.out.println("取款成功!");
					}	
			break;
			case 2://2、查询 
					String b2="select pre_money from Atmpre where pre_idcard=?";
					psmt=con.prepareStatement(b2);
					psmt.setString(1, idcard);
					rs=psmt.executeQuery();
					int money1=0;
					while(rs.next())
					{
						money1=rs.getInt("pre_money");
						System.out.println("余额为:"+money1);
					}
			break;
			case 3://3、转账 
					System.out.println("请输入转账账户");
					String c=sc.next();
					String c3="select * from Atmpre where pre_idcard=?";
					psmt=con.prepareStatement(c3);
					psmt.setString(1, c);
					rs=psmt.executeQuery();
					if(rs.next())//判断数据库中是否存在这个账号
						{
						System.out.println("是否装转账给y/n:"+rs.getString("pre_name"));
						String str3=sc.next();
						while(str3.equals("y"))
						{
							System.out.println("请输入转账金额");
							int c1=sc.nextInt();
							String c2="select pre_money from Atmpre where pre_idcard='"+idcard+"'";
							rs=psmt.executeQuery(c2);
							int money2=0;
							while(rs.next())
							{
								money2=rs.getInt("pre_money");
							}
							if(c1>money2)
							{
								System.out.println("余额不足");
							}
							else
							{
								String str1="update  atmpre  set pre_money=pre_money-? where pre_idcard=?";
								psmt=con.prepareStatement(str1);
								psmt.setInt(1, c1);
								psmt.setString(2, idcard);
								psmt.executeUpdate();
								String str2="update  atmpre  set pre_money=pre_money+? where pre_idcard=?";
								psmt=con.prepareStatement(str2);
								psmt.setInt(1, c1);
								psmt.setString(2, c);
								psmt.executeUpdate();
								System.out.println("转账成功!");
								break;
							}
						}
					}
					else
					{
						System.out.println("账号不存在!");
					}	
			break;
			case 4://4、存款
					while(true)
					{
						System.out.println("请放入面值为100的钞票,单次最多100张");
						int d=sc.nextInt();
						if (d%100!=0)
						{
							System.out.println("存入失败");
						}
						else
						{
							String str1="update  atmpre  set pre_money=pre_money+? where pre_idcard=?";
							psmt=con.prepareStatement(str1);
							psmt.setInt(1, d);
							psmt.setString(2, idcard);
							psmt.executeUpdate();
						}break;
					}
			case 5://修改密码
					int l=1;//l和l1用来判断外层循环执行
					int l1=1;
					while (l==1) 
					{
						System.out.println("请输入旧密码");
						String str1=sc.next();
						if(str1.equals(pwd))
						{
								l=2;
								while(l1==1)
								{
								System.out.println("请输入新密码");
								String str2=sc.next();
								System.out.println("请再输入一遍");
								String str3=sc.next();
								if (str2.equals(str3))
								{
									l1=2;
									String str4="update atmpre set pre_password=? where pre_idcard=?";
									psmt=con.prepareStatement(str4);
									psmt.setString(1, str3);
									psmt.setString(2, idcard);
									psmt.executeUpdate();
									System.out.println("修改成功!");
								}
								else
								{
									System.out.println("两次输入不一致,请重新输入");
									l1=1;
								}
								}
						}
						else
						{
							System.out.println("密码输入错误");	
							l=1;
						}
					}break;
				}
			}
		catch(Exception e)
		{
			e.printStackTrace();
		}
		finally
		{
			if(rs!=null)
			{
				rs.close();
			}
			if(psmt!=null)
			{
				psmt.close();
			}
			if(con!=null)
			{
				con.close();
			}
		}
	}
}

(代码拙劣仅供参考)
注:以上代码均来自实际编写,如有问题请留言,转载请注明出处。