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 语句发生任何匹配关系。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值