PrepareStatement和Statement的联系和区别

联系: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 的所有功能,它爸能做的它都能做,它能做的它爸不一定可以。

猜你喜欢

转载自blog.csdn.net/chris__x/article/details/106762867