PreparedStatement和Statement的区别:
/**
* 1、对比一下Statement和PreparedStatement?
* statement存在sq1注入问题,PreparedStatement解诀了sql注入问题。
* Statement是编译一次执行一 次。PreparedStatement是编译一次, 可执行N次。
* PreparedStatement会在编译阶段做类型的安全检查。
* 综上所述: PreparedStatement使用较多。只有极少数的情况下需要使用Statement
* 2、什么情况下必须使用Statement呢?
* 业务方面要求必须支持sQL注入的时候。
* Statement支持sQL注入,凡是业务方面要求是需要进行sq1语句拼接的,必须使用Statement
*/
代码:
import java.sql.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Test08_解决SQL注入问题 {
public static void main(String[] args) {
//初始化一个界面的方法
Map<String,String> userLogin = chuShiHuaUi();
//验证用户名和密码
Boolean dengLu = login(userLogin);
//最后输出结果
System.out.println(dengLu ? "登录成功!" : "登录失败!");
}
private static Boolean login(Map<String, String> userLogin) {
//打标记
Boolean b = false;
Connection conn = null;
//PreparedStatement 是Statement的一个接口
PreparedStatement ps = null;
ResultSet rs = null;
try{
//1、注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2、获取连接
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/donglijiedian","root","zhixi158");
//3、获取 预编译 的数据库操作对象
// sQL语句的框子。其中一个?,表示一个占位符,一个?将来接收一个“值”, 注意:占位符不能使用单引号括起来。
String sql = "select * from t_user where userName = ? and userPwd = ?";
//程序执行到此处,会发送sq1语句框子给DBMS,然后DBMS进行sql语句的预先编译。
ps = conn.prepareStatement(sql);
//给占位符?传值(第1个问号下标是1,第2个问号下标是2,JDBC中 所有下标从1开始。)
ps.setString(1,userLogin.get("userName"));
ps.setString(2,userLogin.get("userPwd"));
//4、执行SQL
rs = ps.executeQuery();
//5、处理查询结果集
//用户名错的情况下查不到记录,用户名正确情况下也最多查出一条记录,所以用if就够了
if(rs.next()){
return true;//如果存在这条记录就返回
}
}catch(Exception e){
e.printStackTrace();
}finally {
//6、释放资源,由内到外
try{
if(rs != null)
rs.close();
}catch(Exception e){
e.printStackTrace();
}
try{
if(ps != null)
ps.close();
}catch(Exception e){
e.printStackTrace();
}
try{
if(conn != null)
conn.close();
}catch(Exception e){
e.printStackTrace();
}
}
return b;
}
private static Map<String, String> chuShiHuaUi() {
Scanner s = new Scanner(System.in);
//获取用户名
System.out.println("用户名:");
String userName = s.nextLine();//nextLine返回一行数据
//获取密码
System.out.println("密码:");
String userPwd = s.nextLine();
//组装Map集合
Map<String,String> userLogin = new HashMap<>();
userLogin.put("userName",userName);//获取用户名
userLogin.put("userPwd",userPwd);//获取密码
return userLogin;//返回集合数据
}
}