联系:PrepareStatement继承自Statement,两者都是接口,内部都要建立Socket连接,效率都不是很高。
区别主要有以下几点
1、性能方面
PreparedStatement有预编译的过程,已经绑定sq|,之后无论执行多少遍,都不会再去进行编译。而statement不同,如果执行多少遍,则相应的就要编译多少遍sql,所以preStatement的效率比Statement要高一些
Statement statement = conn.createStatement();
PreparedStatement preStatement =
conn.prepareStatement(sql);
执行的时候:
ResultSet ret= statement.executeQuery(sq|);
ResultSet ret= preStatement.executeQuery();
2、代码的可读性和可维护性
虽然用PreparedStatement来代替Statement会使代码多出几行,但这样的代码可读性和可维护性会比较好.
stmt.executeUpdate("insert into tb_ _name
(col1,col2,col2,col4) values
("+var1+"," +var2+"," +var3+' " +var4+")' );
//stmt是Statement对象实例
perstmt = con.prepareStatement("insert intotb_ name (col1 ,col2,col2,col4)
//prestmt是PreparedStatement对象实例
values (???)");perstmt.setString(1,var1);
perstmt.setString(2,var2);
perstmt.setString(3,var3);
perstmt.setString(4,var4);
perstmt.executeUpdate();
3、安全性问题,
PreparedStatement可防止SQL注入。SQL注入情况如下所示:
//输入要删除的账户:'abc' or 1=1
String username="'abc' or 1=1"
//等待用户输入的SQL语句
String sql=select * from user where username =' "+username+“ ‘;
这种情况已经属于非法输入
使用Statement 的话最后的sql语句则是如下所示:
select * from user where name = 'abc' or 1=1;
因为’1’='1’肯定成立,所以可以任何通过验证,里面的数据可能就会被改掉
4、继承关系
因为是继承关系,PreparedStatement作为Statement的儿子,继承了Statement 的所有功能,它爸能做的它都能做,它能做的它爸不一定可以。