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();
}
}
}
}
(代码拙劣仅供参考)
注:以上代码均来自实际编写,如有问题请留言,转载请注明出处。