最新消息

Statement和PreparedStatement

core java 金牌剑客 775℃ 0评论

关系

Statement和PreparedStatement都是接口,且PreparedStatement继承Statement。

推荐使用PreparedStatement

以下从三个方面说明为什么推荐使用PreparedStatement,而不推荐使用Statement

1、可读性

Statement更新示例

statement.execute("insert into t_user(user_name,password) values('" + username + "','" + password + "')");

PreparedStatement更新示例

preparedStatement = con.prepareStatement("insert into t_user(user_name,password) values(?,?)");
preparedStatement.setString(1, username);
preparedStatement.setString(2, password);
preparedStatement.execute();

明显PreparedStatement要比Statement在处理sql上更易读

2、批量执行时的效率

PreparedStatement是预编译的,对于批量处理可以大大提高效率.也叫JDBC存储过程。

语句在被DB的编译器编译后的执行代码被缓存下来,那么下次调用时只要是相同的预编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中(相当于一个函数)就会得到执行。这并不是说只有一个Connection中多次执行的预编译语句被缓存,而是对于整个DB中,只要预编译的语句语法和缓存中匹配,那么在任何时候就可以不需要再次编译而可以直接执行。而statement的语句中,即使是相同一操作,而由于每次操作的数据不同所以使整个语句相匹配的机会极小,几乎不太可能匹配

3、SQL注入

对于上面的例子中,Statement存在SQL注入的危险。
比如下面的查询:

statement.executeQuery("select username,password from t_user where username = '" + username + "'");

如果攻击者知道您的数据库表结构,那么输入

test';delete from t_user where 1=1 or username = 'test

那么最终的语句就变成了

select username,password from t_user where username = 'test';delete from t_user where 1=1 or username = 'test'

后果是难以想象的(此例仅供学习,请勿攻击他人系统)。

而PreparedStatement是预编译的,对于你的上面的输入,会统一认作为一个字符串,不会被单引号(’)等特殊字符分割。

PreparedStatement的缺点

当然万事皆有两面性,PreparedStatement也有缺点,PreparedStatement在第一次执行时想比较Statement消耗是很高的。但相比较安全来讲,这点消耗微不足道。

转载请注明:QualInfo » Statement和PreparedStatement

喜欢 (0)or分享 (0)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址