JDBC中 preparedStatement接口与 statement接口的区别

  •     
  • preparedStatement接口继承了 statement接口,继承了 statement的所有功能,并提供了一整套方法,用 setXxx()方法来设置输入参数(占位符),并且更改了execute、executeUpdate、executeQuery方法,不再需要参数
  • preparedStatement 能够进行预编译,多次执行相同的 SQL语句时,比statement效率更高。并且能够防止 SQL注入。
    • 拿 MySQL来说,MySQL执行一次数据库操作分为几步:
      • 首先检查 SQL语法格式
      • 然后将 SQL编译成可以被执行的函数
      • 最后才是执行 SQL得到我们想要的结果
    • 预编译:preparedStatement 执行过程是将带参的 SQL发送给 MySQL数据库,然后 MySQL数据库对这条是 SQL进行语法校验、编译,在执行 SQL的时候再讲参数作为真实数据传给数据库执行真实数据操作。preparedStatement 将statement的一步分为了两步来操作,这就是 preparedStatement的预编译。

    • 执行效率:preparedStatement在同一连接下执行相同 SQL操作时,第一次连接将带参 SQL发送给数据库,数据库进行校验、编译,然后将这个编译后的函数缓存到服务器中,然后进行SQL执行;当第二次执行这个 SQL时,会直接在服务器中对这个 SQL进行操作,省去了校验和编译的步骤。而statement 每次执行,MySQL都会对这个 SQL进行校验、编译。所以说 preparedStatement的效率比statement效率高,前提是第二次以后的执行,第一次执行并不占优势。而且前提是 MySQL服务器开起了预编译和缓存功能。
    • 防止 SQL注入:preparedStatement 向 MySQL服务器发送 SQL时,首先发送的是带参的 SQL语句,也就是发送的是占位符,并没有将具体的参数值同时发送给服务器,然后 MySQL对 SQL语句进行了校验、编译以后,preparedStatement再将具体的参数值发送给服务器,然后执行是 SQL语句,因为编译是讲过 SQL语法编译成了能够被执行的函数,函数会对传入的参数值进行类型校验,传入的参数不符合函数的参数类型时,会发生异常,所以 preparedStatement能够防止 SQL注入。而 statement向 MySQL发送 SQL语句时,直接将拼接好的 SQL发送给了MySQL服务器,很容易发生 SQL注入问题。

注意

  • 可执行函数存储在 MySQL服务器中,当前连接断开后,MySQL服务器会清除已经存储的可执行函数(也就是只在当前连接生效)
  • MySQL 4.1之前的版本不支持预编译,MySQL驱动版本5.0.5之后默认预编译是关闭的。另外,数据库的预编译需要同时开启预编译功能和缓存功能的,但是在jdk1.7以后 connection实现类自动关闭接口,使用后直接关闭连接,同一连接内大量执行同一 SQL的场景并不多见,所以预编译的使用范围并不广,可能这也是 5.0.5以后默认关闭的原因之一吧。
    • 设置参数开启缓存和预编译:useServerPrepStmts=true&cachePrepStmts=true

总结:

  • 总的来说,preparedStatement与statement的区别,就在于预编译、效率、防止 SQL注入这三点上,而关键就在于预编译

 

以上纯属个人观点,萌新小白,如有错误,欢迎指正。

 

 

 

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值