Statement 和 PreparedStatement之间的关系和区别.
关系:PreparedStatement继承自Statement,都是接口
区别:PreparedStatement可以使用占位符,是预编译的,批处理比Statement效率高
为什么使用 PreparedStatement?
在使用 PreparedStatement之前我们来看一下使用Statement的一个缺点
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Scanner;
public class exercises5 {
public static void main(String[] args) throws Exception{
Class.forName("com.mysql.jdbc.Driver");
Connection conn=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/epet?characterEncoding=utf8","root","");
Scanner input=new Scanner(System.in);
System.out.println("请输入用户名:");
String name=input.next();
System.out.println("请输入密码:");
String pass=input.next();
String sql="select * from master where `name`=? and password=?";
PreparedStatement ps=conn.prepareStatement(sql);
ps.setString(1,name);
ps.setString(2,pass);
ResultSet rs=ps.executeQuery();
System.out.println(sql);
if(rs.next()){
System.out.println("登录成功,欢迎你!");
}else{
System.out.println("登录失败!");
}
}
}
如果输入正确,输出登陆成功,否则输出登录失败。如图:
但是我们输入了精心设计的内容,即时姓名和密码都是错误的,仍然可以显示登录成功
这是因为在使用Statement接口方法时我们需要进行sql语句的拼接,我们这样拼接不仅麻烦而且很容易出错。这就是网上典型的SQL注入攻击
这个时候使用PreparedStatement接口就不存在这个问题了
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.util.Scanner;
public class exercises5 {
public static void main(String[] args) throws Exception{
Class.forName("com.mysql.jdbc.Driver");
Connection conn=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/epet?characterEncoding=utf8","root","");
Scanner input=new Scanner(System.in);
System.out.println("请输入用户名:");
String name=input.next();
System.out.println("请输入密码:");
String pass=input.next();
String sql="select * from master where `name`=? and password=?";
PreparedStatement ps=conn.prepareStatement(sql);
ps.setString(1,name);
ps.setString(2,pass);
System.out.println(sql);
if(ps.execute()) System.out.println("登录成功,欢迎你!");
else System.out.println("登录失败!");
}
}
如果输入正确,输出登陆成功,否则输出登录失败。如图:
当我们密码输入错误的时候
由此我们可以总结出 PreparedStatement相对于Statement的优点
- 提高了代码的可读性和可维护性
- 提高了sql语句执行性能
- 提高了安全性
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)