00:00
我们首先呢,看今天上午讲的这个程序,今天上午我们讲的这个,呃,程序是用面向对象的方式,实际那个练习就是其一,其二呢,我们在做。这个呃,插入的时候我们发现有什么问题啊,找一找。插入在这啊,添加一个新的学生信息的时候,我们发现什么我需要去拼一个思考语句吧,拼的特别辛苦,特别费劲,很明显这种方式在开发的时候是不能做的,所以说我们如何解决拼思考语句的问题呢?啊,这个我们就需要用一个新的对象叫prepare statement。二使用repair statement1为什么需要用prepare statement呢?同学们注意啊,有几点啊,其中第一点。
01:09
说使用statement需要进行拼写词后语句很辛苦。而且容易出错,而且容易出错,那我们希望这个circle语句成什么样呢?Spring circle,我们看我们拼的串是这么写的。拼的说法是这写的,这是C来,我们拼完之后的话,实际上我们在排这个串的时候,我们都不好排,因为你一个一个这么对的话,特别费劲,比方说这个这是个什么呀?这是个单引号,这是一个字符串,然后单引号结束又是一个逗号,然后又是一个单引号吧,我们看的都花眼,所以说也不利于维护,那我们希望什么呢?这个宇句肯定还是需要写,不写肯定不行。
02:07
这么写。Exam student value里边我们知道需要1234567,需要你需要七个位置放七个值,于是这样写。啊,那写一个这样的话的话,那该多好。哎,我们希望写成这样一个色格语句,那如果要写成这样一个色格语句的话,意味着什么呀?是不是都是问号啊?我们还得用一种办法,把这个问号的位置给它填上对应的变量,那值你得填得上啊。于是呢,看如何来用呢?说使用repair statement OK,第一步。
03:02
创建。啊,如何去创建呢?当然是使用connection。Repaired。S等于connection.prepared statement,不过,不过在我创建这个statement对象的同时,我必须传入这个色。必须这么写,看一下。P打头的prepare statement这么写,在我创建这个对象的同时,必须传出一个。二步。
04:00
Prepare statement的对象的。的set,咔咔方法,Set我要放直是吧,第一个位置是int类型的index,第2OBJECT类型的,看看这个方法。Statement我们找你看,有很多set方法,Set方法,比方说我们以这个呃,Set string为例吧。嗯。S string第一个是paraex,下一个是string形的这个X,那我们这块我们写了一个object object也可也可以哈,就是说这块的话呢,是在string这块in,然后是一个索引,这块是一个string形是吗?设置。
05:02
单位数的值,单位数的值好第三步。什么呀,执行circle语句好了,因为什么,因为我现在的话呢,我是一个break statementment,我这块是不是已经放circle了,我已经放色口了,然后的话呢,第二步我为每个占位符的值已经附上了,我在执行的时候还需要传入色口吗?不需要了吧,我们写statement的时候是不是需要传一个circle啊,这个时候不需要传circle了,比方说方法应该是执行或者是查询都可以,但我不需要了,我们找一下这是查询的这样。用这个执行查询的方法。嚯X update会。嗯,执行时。
06:02
不再需要转入,各扣一对。好了,这就是我们的,那顺便说一句,是的,接口Y就是使用,它应该是how,如何来用的,是什么,这个写200怕的。说首先是的子哦,意味着什么?这意味着里边可以用到statement的所有方法。好了,其次什么可以转入?
07:04
带站位服的最后一对。并且。提供啦。呃,什么补充占位符。尽量的方法,变量的方法,OK方法。好,以上的话呢,就是我们的,首先我们看爱为什么需要有他,我们第一个就是看到上不起这个啊,太辛苦了。好了,Prepare statement是什么?它是statement的一个子接口,那它也是用于执行SL语句的,但是它可以传入带暂位符的色口,而且提供了方法来填充这个站位符。那具体使用三步,第一个创建,创建的时候呢,需要传入一个circle口,第二个我们调用set叉叉叉方法把为这个circle单位符赋值,第三个执行,执行的时候不需要再转入circle口,顺便说一下,你说这个索引值从几开始啊?索引值从从几开始?我也不知道,看一下这个吧。
08:32
回退随便找一个赛都可以看疏远值是不是从一开始啊,远值从一开始好了。等一下看看。Public test repair statement,使用方式跟今天上午一样一样的。
09:03
整个的过程跟这个一样一样了,那这个步骤的话呢,就像我现在写的一样,于是我们写8CONNECTION,等于到第二个的。过来一点。Connection等于JBC或点connection,准备一个circle,我们往我们的customers里边去啊,I条记录ID不用写,ID是自己生成的哈,Name email跟first过来。Insert into hotma。在吗?
10:03
Email value看着123中间用逗号分割,然后创建prepare statement对象等于connection.prepare statement口,然后怎么样,我需要要用set方法进行复值,办repair statement的点set第一个是阵形一啊,我们写个啊。第二个点在一秒。是不是email是吧,在润是吧?二好,我们写一个simple,好六三看最后一个写个prepare statement.s。
11:02
3NEW,诶好了,我在传这个new get的时候啊,有点问题,大家看我是什么类型的呢?我YouTube to date啊,我可以直接放,很可惜这个方法上放的是什么date呀,这一个circle date必须是一个circle date,这这么些不行,Circlel date如何来创建呢?CTRLC看啊circlel date如何来创建?Ctrl shift o,重新考一遍吧,Circle date circle date啊,这样空间不行,它里边需要传入一个it的。Guide。姐。CTRL1。看这个人看明白啊。Circle date,大家看我创建这个circle date需要一个什么呀?是不是需要一个long date呀,这边放的是什么,这里面放的是从从什么1970年0.1直到现在的这个毫秒数,那你毫秒数数可以如何来获取呢?再看看。
12:21
看第二个date u date date里边刚好提供了一个方法,叫get time。That time,它返返回的就是七零年以来的这个毫秒数,所以说我们写的是new一个circle date,然后再new一个YouTube date java.YouTube.date然后用这个YouTube date去get time就可以了。写完好。下一步行statement点注意哈,这个说什么了,我们看见这个方法呢,是prepare statement所具有的,那前面是不是还有statement这个传入circle啊,这个circle不再需要传入。
13:08
Q gd bc bo.release。到statement为什么可以穿他啊,因为这个是不是statement的子接口啊,看结果。哎,执行成功就这么放的,就是13年6月26号就可以了,这就是我们如何来使用prepare statement,看步骤哈,需要分这样的几个步骤。到这里边来,第一步创建这个,那创建的时候的话呢,我需要传出一个circle口,其中这个circle口是可以带站位符的,当然也可以不带,你不带的话,你你就不需要在设置这个值呗,第二步调用set叉,叉叉方法为占位符赋值,第三步执行xcu query跟update进行查询或者是。
14:14
更新执行这个方法的时候,不再需要转入思考好了,这个嗯,讲清楚之后的话呢,大家把今天上午我们讲的这个插入一个学生信息这个过来。你看从当时插入的时候,我们是不是拼了一个色块,是不是很辛苦啊,把这个改为使用prepare statement,我们一起看一下啊,改写这个方法,改写这个方法的话呢,是因为我在这个g bc to里边有个update吧,这个update用的是谁呀?这个是不是这个时候我需要把这个方法进行升级成使用,因为你占用这个方法肯定不行了,是吧?好了,写一个方法,大家看public。
15:22
一个升级的方法,大家说我除了纯入circleq以外,我还需要穿什么?还需要传什么,我要传色口的话,是不是跟这个一样了呀,我还需要传什么,那取决于我在调这个方法的时候,如果这块这个circle串。是一个拼写的,你传入除了传入这个色Q串以外,你是不还需要传入这个色块,一个一个站位扶着直啊。再说一遍哈,啊,我先来写他吧,看这个吧,Public voice I new student,写个to吧,看看,嗯,这是一样的student。
16:15
好吧,然后的话呢,我们知道,但是我需要来预写一个circle,这么写,Insert into exam student value,我们知道57个1234567。也好也好,然后的话呢,我要去调接bc tos的这个update方法,这个时候我只穿一个circle不够完,还需要传什么呀,我是不还需要传入。一个一个单位符的值啊是吧,所以说我们这个方法除了存入四根以外,还需要传什么,还需要传入我这块一个一个占位符的值吧,多少个啊,那这个是七个,其他的可能是五个吧,可能是六个半,所以说这个占位符,所以说这块第二个参数是个什么为好啊,啊对,是一个可变参数为好。
17:18
那刚好这两个可以构成方法的重载,好了,我回答我这样写,大家看这个时候我这样转student点。当然了,这个之后你看啊,这个时候如果这块要是写个这个的话就好,否则也比较麻烦,写什么呢?写一个一个的都是什么,第一个flow ID。ID card。Name。
18:02
Name啊,我要这样写的话呢,这块就清楚了,可以照上面写ID ID card that exam card that student name that。看1READ写完写完好了,我调到这个方法,这个时候的话呢,我们看啊,从这块我不用拼这个串了,但我传参是必须的,起码我们写的时候的确是比前一个方便了,拼串非常辛苦,而我要是写这么一个带问号的一个SQ语句的话,却容易的多,然后把这个值一个一个传了,这咋写这个呢?跟底下那个过程差不多,首先我们看说执行circle语句使用。
19:16
Char c地址circle,这个是填写circle口,但未符档可变参数。也是呗,等于now statement,等于now catch,一点一点。Finally关还是必须的didb.release no statement OK这块怎么写,Connection?
20:03
较长等于bc tools.get connection下一步,下一步prepared statement等于connection,哪有circle口啊,下一步比较关键。我是不是需要往里边文参呢?有几个我也不知道吧,这这个是不是也是一个数主啊,我使用一个for循环,In I等于零,I小于二,点I加加,然后是statement s,那你不知道这个类型是什么吧,Object。不知道这个类型是什么,这个是I加一,所以是不是从一开始啊,这个是X。哎,能理解不,这个是从一开始,而这个数组的所引是不是从零开始啊,然后执行最后一段update。
21:07
这就完成先看效果,然后的话呢,我们再做说明,到这个里面来看一下I的new。啊,这个变成to。后来就是他没问题啊,这个是这个流程OK,看效果,ID5在六级ID卡211211990。0204567719901212。
22:09
黄盘锦入职OK过了看。说一下啊,肯定进来了是吧,盘锦王新的五没问题,OK,这个执行是可以的,好了,我们现在的话呢,往回再看一下这个方法,我教的是这个方法,然后先啊写了一个带单位符的circle口,然后呢,调的这个同载的update的方法,这里边有一个可以商去的地方,大家看到了,诶我们这块为什么用可变参数而而不用数组呢?如果用用一个数组行不行?行不行,行吧,但是用数主是不用是不比用可变参数麻烦呢?如果要用数主的话,是不是意味着在这个地方你得把这个封装成一个数组吧,而可变参数我是不是爱添几个添几个呀,而且在这边用的时候,我是不是也可以当数来用啊,所以说这个用可变参数比数组。
23:22
更好。那这块这是第一个,呃,创建prepare statement,填写占位符,执行方法跟我们先前写的是。一样的。好了,刚才没写好的,把你的程序改一下。我们继续来看这个,那么它最大的好处呢,就是可以。写这种预编译的词后语句,就是说哎,可以写带战略符的词后语句,为我们写代码带来了很大的方便,那实际上它还有一些好处,就是这个Y里面不只是它,还有什么呀,它可以防止色Q注入。
24:07
二可以有效的禁止。Circleq注入啊,什么叫circleq注入呢?就是说我们在写代码的时候呢,我那个SQ语句啊是拼起来的,那我就利用那个S语宙是拼起来的,我往里边再插值的时候,我可以达到啊我的一些目的,这这就是叫呃色Q注入,我们看一下这个概念哈,色Q出入利用某些系统没有对用户输入的数据进行充分的检查,而在用户输入数据时注入非法的SQ语句或命令,从而利用系统的SQ引擎完成恶意行为的做法,那防止搜购注入的话,可以使用prepare statement就可以了,CTRLC。
25:12
这是一个。这是一个。好,那我们看一下什么叫色注入呢,来。Public circle看一看色Q注入的问题啊,那你想说色Q注入的话呢?我们先来创建一张数据表。比方说叫user哦,写两个一个用户名user name干啥?
26:01
25、再写一个password密码。我差25。好,打开我写一个第一个,我写个汤姆123456好了。保存现在的话呢,比方说这是一个用户表,我想登录的话,必须输入正确的用户名和密码。我只有输入正确的用户名和密码的话才可以登录,那我们现在使用statement看一下circle等于。Select。用户名和密码。From user user name等于。
27:04
And as swd等于。写好的好了,我是拼的串吗?You the name等于now pass what等于now,把两个串给它拼进去,大家看啊,这么拼有name。这是加上什么呀,加上他。好记好之接好之后是这样的,然后我们先来打印一下ex这口,我用户名密码要如果对的话,我可以登录,那我首先我还得有一个查询的一个过程,等于now。
28:08
Statement等于,那来看一下,哎,我查询嘛,需要用到等于。有异常抛不出来。而不关闭。OK,等于这个bc to.get。Statement等于connection.create statement set等于statement点执行查询好,我只需要看什么呀?我只需要看这里边,当然之后有没有数据吧。
29:03
赛点。Next,这是不是不是猪就OK啊,登录成功。成功了。用户名,用户名和密码不匹配或。用户名不存在失败,就这么一个程序,那我很明显,我这块我在写的时候,我写的汤姆和123456,这是可以成功的。成功,这没问题,好了,我写个12345。是不是不能成功啊,能理解吧,OK,那现在的话呢,我这个搜狗语句啊是拼写的,我有没有可能在我不写正其正确的用户名和密码的情况下,我也登录成功,有这个可能。
30:12
怎么写呢?拷贝出来。好,我们看看哈,在我这个用户名和密码,嗯,正确的情况下,我也能够成功,怎么写大家看哈,首先呢,这个是没有的。这个是这个,我这往里边添东西啊,好了怎么写。我首先and需要被我禁掉,有and肯定不行是吧,And需要去被我禁掉,我怎么写呢?那我们用一些手段啊,比方说我写个A里边写个A,然后写他哦。
31:05
这个一这个小A吧,二什么呢。阿斯霍的。等于啊。再写个哦。一等于。一好了,首先我们看这四个语数对不对,CTRLC拿过来。邮件。查询好价。写出。A,哦,这个是什么的问题吗?这个是这个号的问题啊。这个好吧,又贱。行,好了,看是不是查出来了呀,是不是查出来了,哎,这个结果就正确了,我怎么写的,我正常情况下看着,正常情况下应该这样,You的name等于。
32:11
X pass等于以前是不是这么写的,这么写的吧,什么了,我让这个位置这个值是C过来。这。啊,我让后边这块这个值是做的做的你看哈CTRL。C再过来。好,于是我跑一下。大家看是不是也成功了呀,就叫色Q注入,我利用你这个色Q是拼写的,然后的话呢,我恶意的填写这样的代码,我就可以登录成功,这就是四狗注入,那么怎么登录成功的呢?我们再来看这个四狗语句,看啊怎么写的呀,你看牛的name等于A,我是不是写了个O啊password password等于这个值吧,那这个是真是假,它就无所谓了呀,他也无所谓吧,我是不是有个哦,是不是有个一等于一啊,那这时候就可以,所以说你看这个是我添的。
33:28
到这,这是我填的username,而这个是我填的passord,这样的话这个人登录不就可以成功了,当然这个使用prepare statement可以啊,马上切成原型不好用,Prepare statement是什么情况,是不是用问号啊,用问号的话,那你这个就是u nameme,这个就是passwordd,那么这个将啊不复存在,没有这种情况我们也试一下吧。
34:02
如果使用prepare statement,这种情况将不复存在。使用prepared statement将有将。有效的解决问题,那如果要是用的话,这个就是用户名,这个就是密码,根本就没有以上的这些事,CC。对。上去吧,Youname等于问号,And and password。等于问号。为什么进?
35:01
好了,然后这个是就不用写了啊呃,然后写这个写成。等于now来statement,等于点传入circle口放值statement set string1有the statement.set string two啊。好了,然后查询result set等于statement执行查询OK,再看。有一个错。Statement。啊,这个时候的话呢,我们就是使用这个来搞的,你看这。
36:05
肯定是失败的,因为怎么了,他确实是拿这个当用户平台,这个当密码吧,不存在着我们这个嗯匹匹配的问题,所以说这个时候的话呢,就可以解决这个问题,那大家这块需要知道什么是词库注入,起码你需要知道我把这个,我把这个语句呢,给大家复制过来,这就叫思口重录拿过来。哎,我这块有个什么呀,我这块有一个。啊,用户名有一个密码,然后拼一个circle完之后这个长啥样呢?长的大致上是这样。的这个这个啊,使用prepare电路的第二个好处,实际上的话呢,还有一些好处三。
37:08
看PPT。后几个好处的话呢,我们做一个了解就可以了啊呃,代码的可读性和可维护性,这个我们刚才已经说过了,最后边一个可以防止S入,还有一个就是它能够最大可能的提高性能。因为它是什么,特别是在我们批量插入的时候,这我们批量插入的时候,如果要批量插入使用statement的话,每次都需要穿一个circle,而使用pre文的话,那个circleq已经编译好了,那这个时候的话呢,我直接往里边放值就可以,这个时候这个效率就会提高,说数据库服务器会对预编译的语句提供性能优化,因为预编译语句有可能被重复使用,所以说语句在数据库服务器的编译器编译后,执行代码被缓存下来,那么下次调用时只是。
38:04
执行相同的语句就可以了,不用再进行编译,只要把这个数轴里边一传就可以,而statement每次传都一样,它不能够进行缓存,所以说这个效率就会低一点,那具体需要干什么呢?Statement的话,我希望我需要进行语法检查,语以检查翻译,翻译成二级制命令,再缓存等等等,所以说我们使用pre statement可以尽可能的提升性能,这个我们在后边讲批量录入的时候,我们会来说这个事,好了,我的的。第一个好处啊,使用prepare statement可以使这个代码更简洁,我们使用起来更方便,第二个可以有效的防止色库注入,然后的话呢,还可以提高性能,提高性能在这。好了啊,具体如何用?呃,具体是什么呢?它是STEM的一个子接口,可以传入带单位符的SCO语句,并且提供了补充单位符的方法,具体使用的话比较简单,第一个创建prepare statement,这个时候传的circle口可以带单位符,也可以不带单位符,你要不带单位符的话,你是不是就不用往里边添这个单位符了?第二个我们调用set方法往里边添单位符,然后执行就可以了,执行的时候不需要再传入任何的。
39:30
那我们还提供了,还提供了我们这个update方法的一个升级方法,传入占位符了。
我来说两句