00:20
好。我们来对比一下谁。对比一下各位啊,Statement存在什么什么问什么现象,存在circle注入问题吧这个。好,这是第一个对比点,第二个对比点。
01:04
我问大家。Statement和prepare statement哪个执行效率比较高?How。一次。为什么呢?大家看前面这个啊,我们这一块是不是会传一个用户名和密码。对吧,哎。拼接了一条新的S口L语句吧,到第68行的时候,68行啊,是不是会把这个SQL语句编译一次。对不对,然后执行吧,好。在数据库方面呢,我需要给大家再普及一个东西,再普及一个知识点,各位啊,在这个数据库方面,如果执行一个select from回车,我查询出这个员工表的员工的名字吧,好,各位啊,如果接下来你写的这条SQL语句和上面那条SQL语句完全一样,什么叫完全一样?
02:22
包括空格的数量,包括大写小写完全一模一样的话,这条SQL语句它是不会编译的,就直接执行了。这个知识点我之前没有给大家提过,但是现在呢,我需要给大家提一下来,我再说一下啊,你写了一条搜狗语句,如果第一次是这么写,它编译一次,并且执行一次,当你第二次写的时候,你任何地方都没有改动,你再执行的时候,它就不不再编译了,它就直接执行了。听懂了吗?除非您在这加了个空格,记住了啊,您一旦加空格这个语句是不是跟以前就不一样了,它会重新编译,你懂吧,重新编译,再重新执行,听懂了吗?好,我问大家一个问题。
03:02
如果用statement。去执行这个SQL语句的话,那么我问大家是不是每一次用户名密码都不一样,导致拼出的这条SQL语句是不是每一次都不同,所以是不是编译一次执行一次,编译一次执行一次是不是这样的效果,我们来看后面的这个prepared statement,它的特点是什么呢?我们从这个S开始到最后这个整个这个S语句是不是永远都不会变?永远不会变。问号也不会变呀。因为我编译的时间在哪,在你传值之前,传值之前这条SQL语句是不是编译一次就行了,我问大家如果以后想执行第二次是这是不是直接给这个问号传值然后执行就行了,执行第三次是不是也是只传值就执行就行了,整个过程当中就是编译一次,它可以执,可以执行N多次,以后都不需要再编译了。
04:10
听懂了吗?所以从这个角度来看,效率要略高于。来。这个statement的特点是编译一次,执行一次。编一可执行N次D,效率较高一些,另外还有一点,各位还有一个什么,我给大家讲啊,你呢听就行,做会在编译阶段啊,做什么做类型的安全检查。
05:08
的这个名字,我给他传的是一个110,我问大家是不是已经出错了。但编译器检查出来错误了吗?登录的名字是不是不能传个数字,必须得传个串,串是不是必须得是带单引号才是串?是这意思吧?我已经出错了,但编译器告诉我了吗?编译器告诉我了吗?没有,好,我们一起来看一看,我们后者这个如果传的参数是一个100,它会不会报错?因为在编译个会更安全一些,会在编译段进行类型的安全查好,也就是说我总结出来了三方面,他们是不同的,第一方注入一存在,一个不存在,第二方面综述。
06:40
以后99%以上的情况都是用。有的老师还剩了个1%。你说的有道理,因为不是所有的事情都能搞定的,因为有一些我们可能需要用户进行SQL注入。
07:07
有一些系统我们是需要注进去circle的,如果您当时用的prepare,根本你怎么都住不进去啊。住不进去,所以这块呢,我们现在说的是综上所述,一会你举个例子啊,别着急啊,让你看明白啊,综上所述什么呢。只有极少数的情况下需要使用什么statement?那现在问题来了,问题来了,各位什么情况下会必须,什么情况下必须使用?业务方面要求必须支持什么注入的时候。
08:04
业务方面要求必须支持Q注入的时候,你就必须得使用state进去啊。Prepare传进去,只能往这传值啊,不能拼circle。不能拼接SQL语句。Statement。支持什么SQ出入,凡是业务方面要求是需要进行什么SQ语句拼接的,必须使用什么statement。各位啊,这块我讲到位啊,讲到位。
我来说两句