PreparedStatement and Statement (TODO)

PreparedStatement and Statement 

前言


public interface PreparedStatement extends Statement 看到这个恐怕就要揭晓大致的主题了,聪明的你肯定猜到了就要研究一下代码,虽然这么说,重点还是放在两者的区别,基本上看名字都能猜到prepared大概是预先编译了,从字母长度的角度考虑,多加了这么多字母肯定完成了不少高大上的工作,那么我们来具体分析一下吧。

正文


分析这类问题的一般思想是: 应该是特点(特别需要记忆的)+性能(速度、占用资源)+应用场景

PreparedStatement预编译的,防止注入的,效率高,更安全的,可读性和维护性更好

什么叫做防止注入的,看一下代码示例:

SELECT * FROM student where name = '李小狼' AND PASSWORD = ''; DROP TABLE tableName;#
使用PreparedStatement对象,可以有效防止sql注入

这句话如果不适用PreparedStatement的后果就会删除table,对于数据库而言数据是不可丢失的重要资源,所以一定需要有方式屏蔽此种隐患, 那么查看setString()方法来看看是否有线索

相关链接:

JDBC提供了数据库batch处理的能力,在数据大批量操作(新增、删除等)的情况下可以大幅度提升系统的性能。在没有采用batch处理时,删除5万条数据大概要半个小时左右;采用了batch处理的方式,删除5万条数据基本上不会超过1分钟。可见batch的确很厉害,但是究竟如何防止注入的,暂时还未探索出来,但是查阅了相关资料,发现是通过“转义单引号”。

原理:

查询资料可知jdbc通过把用户非法输入的单引号用\反斜杠做了转义,来防止非法值sql的注入(当然这个没有亲自查验过,因为如上文所说遇到batch方法后遇到了小小的瓶颈,暂时解不开作用)

语句被编译器编译后,执行代码就会被缓存下来,下次调用时,只要相同的预编译语句就不需要编译,只要将参数直接传入编译过的语句执行

频繁使用的语句可能被缓存起来 以保存有更多的空间存储新的预编译语句

牛客网选择题补充知识


JDBC提供了Statement、PreparedStatement 和 CallableStatement三种方式来执行查询语句,其中 Statement 用于通用查询, PreparedStatement 用于执行参数化查询,而 CallableStatement则是用于存储过程

对于PreparedStatement来说,数据库可以使用已经编译过及定义好的执行计划,由于 PreparedStatement 对象已预编译过,所以其执行速度要快于 Statement 对象”

PreparedStatement中,“?” 叫做占位符,一个占位符只能有一个值

PreparedStatement可以阻止常见的SQL注入式攻击

 

彩蛋——那么CallableStatement是什么情况呢?


惊!public interface CallableStatement extends PreparedStatement,所以有可能下次探索啦,我是小咲,下次再见吧

发布了113 篇原创文章 · 获赞 173 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43914278/article/details/104418907