Statement和PreparedStatement的区别:
Statement为一条Sql语句生成执行计划,
如果要执行两条sql语句
select * from Student where lastName = “Durant”;
select * from Student where lastName = “James”;
会生成两个执行语句
如果是100条,那就必须重复写100条致执行语句。
PreparedStatement用于使用绑定变量重用执行计划
select colume from table where colume=:x;
通过set不同数据只需要生成一次执行计划,可以重用
是否使用绑定变量对系统影响非常大,生成执行计划极为消耗资源。
两种实现 速度差距可能成百上千倍
1.PreparedStatement是预编译的,对于批量处理可以大大提高效率.也叫JDBC存储过程
2.使用 Statement 对象。在对数据库只执行一次性存取的时侯,用 Statement 对象进行处理。PreparedStatement对象的开销比Statement大,对于一次性操作并不会带来额外的好处。
3.Statement每次执行sql语句,相关数据库都要执行sql语句的编译,PreparedStatement是预编译得,PreparedStatement支持批处理
4.执行许多SQL语句的JDBC程序产生大量的Statement和PreparedStatement对象。通常认为PreparedStatement对象比Statement对象更有效,特别是如果带有不同参数的同一SQL语句被多次执行的时候。PreparedStatement对象允许数据库预编译SQL语句,这样在随后的运行中可以节省时间并增加代码的可读性。
然而,除了缓冲的问题之外,至少还有一个更好的原因使我们在企业应用程序中更喜欢使用PreparedStatement对象,那就是安全性。传递给PreparedStatement对象的参数可以被强制进行类型转换,使开发人员可以确保在插入或查询数据时与底层的数据库格式匹配。
当处理公共Web站点上的用户传来的数据的时候,安全性的问题就变得极为重要。传递给PreparedStatement的字符串参数会自动被驱动器忽略。最简单的情况下,这就意味着当你的程序试着将字符串“D’Angelo”插入到VARCHAR2中时,该语句将不会识别第一个“,”,从而导致悲惨的失败。几乎很少有必要创建你自己的字符串忽略代码。
在Web环境中,有恶意的用户会利用那些设计不完善的、不能正确处理字符串的应用程序。特别是在公共Web站点上,在没有首先通过PreparedStatement对象处理的情况下,所有的用户输入都不应该传递给SQL语句。此外,在用户有机会修改SQL语句的地方,如HTML的隐藏区域或一个查询字符串上,SQL语句都不应该被显示出来。
在执行SQL命令时,我们有二种选择:可以使用PreparedStatement对象,也可以使用Statement对象。无论多少次地使用同一个SQL命令,PreparedStatement都只对它解析和编译一次。当使用Statement对象时,每次执行一个SQL命令时,都会对它进行解析和编译。
最后通过两个简单代码看一下两者的区别:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class SimpleJDBC {
public static void main(String[] args) throws Exception {
Class.forName("com.mysql.jdbc.Driver");
System.out.println("Driver loaded");
Connection connection = DriverManager.getConnection(
"jdbc:mysql://localhost/javabook", "root", "root");
System.out.println("Databases connected");
//create a statement
Statement statement = connection.createStatement();
//execute a statement
ResultSet resultSet = statement.executeQuery("select firstName, mi," +
" lastName from Student where lastName = 'Smith'");
while (resultSet.next()) {
System.out.println(resultSet.getString(1) + "\t" +
resultSet.getString(2) + "\t" + resultSet.getString(3));
}
connection.close();
}
}
输出结果为:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class SimpleJDBC2 {
public static void main(String[] args) throws Exception {
Class.forName("com.mysql.jdbc.Driver");
System.out.println("Driver loaded");
Connection connection = DriverManager.getConnection(
"jdbc:mysql://localhost/javabook", "root", "root");
System.out.println("Databases connected");
PreparedStatement preparedStatement = connection.prepareStatement(
"select ?, ?, ? from Student where lastName = ?");
preparedStatement.setString(1, "firstName");
preparedStatement.setString(2, "mi");
preparedStatement.setString(3, "lastName");
preparedStatement.setString(4, "Smith");
ResultSet resultSet = preparedStatement.executeQuery();
while (resultSet.next()) {
System.out.println(resultSet.getString(1) + "\t" +
resultSet.getString(2) + "\t" + resultSet.getString(3));
}
connection.close();
}
}
输出结果为:
参考连接:
https://blog.csdn.net/woshishuiaaad/article/details/52209304