Statement和PreparedStatement的区别
一,Statement对象
Statement对象主要是将SQL语句发送到数据库中。JDBC API中主要提供了三种Statement对象。
1,Statement对象
1)用于执行不带参数的简单SQL语句
2)使用Statement对象,将变量手动设置到SQL语句中(通过拼接的方式),可能导致SQL注入,见下面例子:
例1:
select * from user where username = '输入变量的值';
这样就没有处理单引号,SQL语句就存在问题。可能会导致查询到一些其他的内容,导致数据泄露。
2,PreparedStatement对象
1) 用于执行带或者不带参数的SQL语句
2) 执行速度快于Statement对象,因为PreparedStatement 接口继承 Statement,PreparedStatement 实例包含已编译的 SQL 语句,预编译在数据库系统(预编译时带占位符的SQL,之后只要传入参数,就可以在预编译好的SQL语句中执行)
3) 安全上比Statement对象更好,可以防止SQL注入。
4)PreparedStatement对象防止SQL注入的原理:
- 使用占位符,并预编译SQL语句
- 符号在转义后将变量设置占位符(具体就是单引号在转义后替换占位符)
5)只是基于单引号的转义,但是其他类型的SQL注入的方式就太多了,所以不能防止所有的SQL注入
6) 作 为 Statement 的 子 类 , PreparedStatement 继承Statement 的 所 有 功 能 。 三 种 方法 execute、 executeQuery 和executeUpdate 已被更改以使之不再需要参数
3、在 JDBC 应用中不要使用 Statement
原因如下:
一、代码的可读性和可维护性.Statement 需要不断地拼接,而 PreparedStatement 不会。
二、PreparedStatement 尽最大可能提高性能.DB 有缓存机制,相同的预编译语句再次被调用不会再次需要编译。
三、最重要的一点是极大地提高了安全性.Statement 容易被 SQL 注入,而 PreparedStatementc 传入的内容不会和 sql 语句发生任何匹配关系。