00:00
行,那么这个连接呢,咱们就告一段落,然后呢,看一下咱们这个课件,课件的话呢,在这儿就列举出来这五种连接方式啊,大家下来呢可以练一练,但是练的话呢,呃,如果时间不充裕,大家就直接练这个舞就行,这个前面这几个呢,作为一个过程出现啊,然后最终呢,就是你知道我们为什么要这样几种迭代啊,是这种啊嗯,行,然后下边呢,我们看这个第三章,咱们可以诶讲其中的其中一个知识点线啊,这个使用prepared statement实现,叫c rud操作,这个c rud呢,咱们在基础稍微提到过啊,C create retrieve update delete,哎,就是我们所谓的增删改查。对,就是咱们对于数据库最常见的这几个操作了,那么使用prepare的STEM去做这个呢?诶稍微的介绍一下,我们那会在讲这个流程的时候呢,在这啊提到过我们获取连接了,下一步呢,我们就要创建一个statement对象,哎,让这哥们拿着SQL语句就来操作数据库了,那现在呢,我们实际上要创建的是这个statement的对象,但是我们现在讲的叫prepared statement。
01:09
这两个呢,是接口和子接口的关系。哎,这个prepared statement是一个statement的一个子接口啊,咱们真正开发中呢,用的都是它,不会用它,那咱们其实想强调的就是这个statement它会存在一些弊端,哎,咱们把这个弊端呢给大家解释一下,在解释之前呢,咱们先说一下这个他们这几个都做什么用的啊,那么数据库连接呢,被用于向数据库服务器发送命令和SQL语句。啊,并接受数据库服务器返回一个结果,其实上一个数据库连接就是一个so连接啊,这就是咱们讲web里边so连接,获取连接以后呢,我们接着去传输数据了,那么关于如何去诶发送这个SQL语句,我们这呢提到了三个结构。当然也是三个接口啊,因为S公司呢,这块主要提供标准啊,这个statement是用于执行静态的SQL语句,并返回所生成的结果的对象,Prepared statementment这呢有个预编译,就大家目前看这个话呢,可能看不懂。
02:12
啊,因为呢,我们还没有具体讲这个代码啊,有了代码以后你再看就更清晰,就跟说你这个看那些那个哲学上的一些话一样啊,你一看的话呢,其实是似懂非懂啊,你得去实践,实践完以后呢,你才证明这个事儿是对的,或者一般咱们。年轻的时候,大家其实现在也很年轻啊,就是咱们小的时候呢,有一段时间是比较有叛逆期的,父母说什么话都爱顶着干是吧,他说的那些话呢,你谁不懂都懂是吧?但是其实当你自己经历完这些事以后,你会发现,诶,父母呢,其实说的是对的。就是其实一开始你懂的话呢,你处在第一个懂的这个状态,后来呢,你会有否定,然后再后边呢,就要否定之否定了。哎,就是父母呢,处在这个阶段,你处在这个阶段,所以你俩没有共同语言,你觉得说我也懂你也懂有啥区别,你没有经历过这个过程,否定之否定的一个过程是吧?好,这块呢,我们提供了这样的三个接口,诶这个statement我们直接说结论哈,这个呢,咱们后边就不用它了啊,因为它有一些弊端等先就来解释这个事,咱们要用的话呢,都用的是这个prepared statement用的是它,而这个Co statement呢,它是用于执行哎这个存储过程的,这个存储过程呢,就是也是我们也算是一个数据库对象了啊呃,这个咱们就先不在GDBC里边去介绍了,真正呢,它的使用我们的后边框架的时候呢,再具体来说啊,就是核心的内容,关于prepare limit,这个我们能够解释清楚,那么底层的框架的,诶,我们就知道底层怎么去实现的了,这就我们的一个意义啊。
03:45
也就是说呢,我们具体要展开,呃,针对于呃,数据库要操作了,专manager咱们已经用过了,获取连接了,正常来讲呢,应该用statement了,哎,如果你要是一个查询就有个结果,哎后边呢,我们发现咱们statement都不用了,都用它来替换,就用它了,那你要是存储过程呢,我们再用它,哎是这样一个流程,那下边呢,咱们就来解释一下这个statement他在操作数据表方面的弊端,这个弊端呢,咱们就不花大篇幅去这个这个写这个代码了,直接呢,大家只需要。
04:17
诶把咱这里边儿的这个内容呢拿过来啊,因为咱们重心呢不在这儿,咱们只是演示一下它的弊端就可以了,这两个代码CTRLC站到咱们当前的某一个包下,我再去新建一个。这个呢,我们叫做诶statement它的一个诶crud操作行,然后呢,选中它CTRLV一下粘进来,嗯,这里边我们ctrl d ctrl e重新生成这样一个报名CTRLC。CTRLV一下保存。行来看一下啊,这呢就是我们普通的一个user类,这里边呢有user和password啊,构造器to string盖塞方法没了,这呢我们都比较熟,回过来我们主要看这这呢是关于STEM的一个测试,具体细节呢,哎,关于这个如何使用STEM实现对数据表的查询操作,这个咱们就不详细的去说了,因为咱们后边讲的话呢,诶prepare的怎么做,咱们会详细的来讲,这个呢,咱们就了解就行,那有了这个方法以后,我们呢,主要是写的上面这样的一些逻辑,哎,把这个逻辑呢,我们整个都给它删掉,咱们重新来写啊。
05:31
说现在要做什么事呢?哎,我现在呢,有一个数据库中的表,这个表呢,看是不是他,哎,就他这个表呢,叫user-table里边呢有用户名,有密码。我们呢,就从咱们的Java代码层面,我去输入用户名和密码。如果正确的情况下呢,哎,你告诉我登录成功,如果我要输错了,你告诉我登录失败。哎,可能是由于用户名不对,也可能是因为密码不对,那你给我一个提示,这个事呢,大家平时经常见,那我们就来模拟这个过程,好这块呢,我们要模拟从控制台上去输入数据,咱们就用一下这个scanner,诶new一个scanner,诶这个都比较熟了啊,咱直接来写了。
06:21
行,然后呢,给一个提示。奥特斜杠。嗯,请输入用户名,这样这个咱们就直接在后边输入了啊,我就不要这个换行了,拿着这个scanner,第二看next操作,诶CTRL1这个呢,我们得到了一个叫user,接着呢获取密码。请输入密码,这个跨行呢,我们也不要了。第二,Next方法,CTRL1,诶,获取一个password。
07:01
行可以了,然后呢,我们需要呢,把这个用户密码呢,写到一个SQL语句里边,因为咱们现在要调的是这个get方法,Get方法里边第一个参数呢,就是一个词人形的一个SQL语句。后边这块呢,就是你想返回,咱们想验证登录成功还是失败,诶咱们呢,其实让他返回一个对象,咱们现在用的呢,就是你这里边儿的这个表,返回来咱们对应的一个类就是这个user类,因为这个类里边呢,正好是用户名和密码,所以这块呢,我们就。哎,我写一个user.class。哎,这样来操作的行,那这个circle呢,没有,那我们需要提供一下,诶提供这个circleq,这呢,就我们相当于写的是一个查询语句了啊,咱们要select。哎,或者说这个事儿呢,咱们可以先在这里边写一下。你看啊,Select叫,呃,这个user password。From user table where user等于啊,咱们刚才那块写了一个叫A是吧,是咱们要传进来这个变量了,And password等于。
08:14
这个呢,咱们写个正确的123456这样子,这个咱们把它呢,整个来讲作为一个字符串啊,写到咱们Java程序里边,我这就放到一行了啊,先选中跑一下。Password写错了。嗯,对,这样选中,那这样呢,我们就查出来了,这个呢,是咱们在这里边验证的一个circleq,啊把它呢,CTRLCL拿过来。然过来我们就放到这,放到这儿,放到这儿的话呢,你注意咱们这个UC等于谁这个事呢,是不是我们输入的呀,那那就是说这个位置呢,我们就不能在这写死了啊,不能写死,你看怎么办呢?它有单引号是吧,所以这个位置呢,我们先把它去掉,对先整俩分号,先把左右两边的先劈开,再整俩加号,中间呢填你这个U。
09:13
大家可能会有点疑虑,因为怎么写的这个呢,我们就称为叫拼串拼拼,本来呢,这个好好的一个字符串,结果这块中间你出现个变量,我们得拼嘛,呃,比较恶心,所以呢,这也算我们的一个弊端,需要拼写词后语句很麻烦,但是呢,好歹还是可以接受的是吧。顶多呢,就是麻烦点啊,先双引号打开,然后呢两个加号,把左右两边这个字符串呢,先劈开,中间呢去传你这个诶变量。就这样。这个下来大家体体验一下,其实还挺舒服的是吧,看的时候呢有点别扭啊,但是这个写法呢,咱们其实不愿意这样写的啊,这看的还是可读性也很差,这个呢,就是我们算是第一个问题啊,叫需要拼串,但是这个呢不算是一个错误,顶多就是稍微麻烦一点而已啊。
10:06
那写完以后呢,我们把这个思呢传进来,这写一个string,呃,这写个userl,然后呢,在这CTRL1咱们就得到了一个具体的user,嗯,上面叫user。这就我们返回的一个,我们叫return哎user吧,那这块我们来判断啊,判断什么呢?就是这个get呢,虽然咱们没有去细看,但是呢稍微简单说一下,我这块呢有一个return now,就如果说你要输的用户名和密码要不靠谱,我就会return now啊,包括你这块return这个T,这个T呢,一开始的值也也是没有的,所以我们这块就来判断你这个return的user,它是不是一个no,如果你要不是no。我就告诉你说登录成功,否则登录失败,诶登录失败呢,一般呢,就是告诉你说有两种情况嘛,要么呢叫用户名不存在或密码错误。
11:06
嗯,就是这样的一个情况,行,这个呢,我们就算是写完了,写完以后呢,现在我们点击一下这个登录执行一下,请输入用户名,咱们先输一个靠谱的啊A。请输入密码123456好回车。很遗憾挂了,说呢no such field,我这块呢写了一个叫user,这个user呢,在我们这块返回的时候呢,没找到这个呢,就涉及到细节的原因了,咱们因为是在这里边写的嘛,它自动的就给我整了个大写的了,是吧,而实际上呢,我们这个在user这个类当中。这是个小写的。哎,注意这个事儿,所以呢,回过来我把这个呢改一下啊,改成它PASS2的话呢也得改。这样,嗯,这这也得改啊。
12:04
诶,为什么要改这个,咱们等讲prepared statement,咱们这些事呢,就都能够解决啊,而且是我们还必须要解决的一个事,讲完以后呢,我们再来。诶。密码123456回撤登录成功,诶这个是没有问题的啊,登录成功的,那演示一个失败的。你看这个呢,我写个A换行。嗯,重新打开一下,我们这个表交A了密码呢,只要不写这个就行。654321回车。哎,就这样,诶这个呢应该都比较清楚了,那下边呢,我们说嗯,这不挺好吗?但我们说呢,这个用STEM来做这个事的话呢,会有一些问题,我们这叫SQL注入的问题,下边就要给大家演示这个事,什么叫SQ注入呢?就是我们在输入的用户名和密码在不正确的情况下,哎,我们也可以实现对数据库的一个恶意操作,比如说我用户名和密码写的不对,我也能够登录成功。
13:09
哎,我们下边就来演示这个事儿,演示这个事的话呢,我们需要呃,先改一个位置啊,这个next操作呢,我们改成一个next land。或者我们先这样写一会的话呢,你知道为啥要改了,先在这我们把这个查询语句先拿出来。哎,这个我们从行就从这儿拿吧。诶,CTRLC啊,CTRLV一下啊,我们下边就要做这个事了,本身呢,我们这个词后L语句的逻辑呢,是这样子的。说呢,查询这两个字段,从列表当中,Where user等于谁,And password等于谁是一个谁写谁的关系,那现在的话呢,我去拼一个串,拼完以后呢,我保证呢也能查出来数据,你看我现在要拼了啊,Where user等于啊,这个我就写一个这个,然后哦。
14:07
And password。嗯,And password等于。哦。好,我写完了啊,你可能看不懂,一会我给你解释啊,写完以后现在的话呢,我要输入一个用户名,用户名是谁呢?我就是这个单引号和这个单引号之间的这个,对,就这个啊,这个时候呢,我要演示的话呢,你看我CTRLC一下这个,我们就需要把这个next呢改成next烂了啊。为啥呢,你看一下这个我1CTRLV1回车,那直接报错了,是因为咱们这个net的方法呢,你是有换行或者有空格的时候呢,他都认为是结束了,哎,那咱们现在呢,我里边是不是写这个空格了,所以咱们保证呢,就是我这个呢,都是我的呃,Username啊,所以这个呢,咱们改成LALA呢,就我们只以这个换行来代表你的获取数据的结束,哎这样子啊,这样的话就方便呢去把它整个来充当咱们的这个user了。
15:13
诶用户名啊,说密码密码我是叫这个。嗯,等于对啊,到这加这个CTRLC好注意看,显然呢,我们这里边儿是没有这个用户名和密码的啊回车。这就叫做SQ注入,明明写的不对,但是呢还登录成功了,究其原因,谁谁导致这个事,就是我们这里边用的是statement啊,所以呢,我们必须要把它替换掉,不要用它,这也是我们为什么没有展开讲它的原因啊,那么怎么会出现这个问题呢?其实这个原理呢,其实比较简单,大家你看啊,我把这个SQL语句呢会粘过来,你看你会不会发现这里边的问题。
16:01
就这样吧。哎,看出来了是吧,原来我们这里边想表达的是谁按的谁。是一个且的关系,然后我这块呢,就让你这个位置来充当是你这个user,这个位置呢,让充当你的password,改完以后呢,它整个把这个SQL语句传到我们这个数据库服务器这块呢,这个结构变了,变成是谁or谁or谁,那只要有一个满足就行,这个呢是横成立的。所以这块我们要一执行,它必然会查出来数据,哎,这就是一个叫SQ注入问题,这个问题我们是接受不了的,就是你前面这个拼串呢,忍了,你哪怕有十个串,我就慢点写也可以是吧,但是你这个售后注入问题我们是接受不了的,所以呢,我们必须要替换掉statement,诶,这也是我们要引入这个prepared statement的一个原因啊,那在这里边关于这个statement这个弊端呢,它有说明啊,说SQ注入呢,是利用某些系统没有对用户输入的数据进行充分的检查,而在用户输入数据中注入非法的SQL语句啊,SQL语句段或者命令啊,比如刚才这个演演示的,从而利用系统的SQ引擎完成恶意行为的一个做法。
17:14
哎,这就是一个SQ注入问题,这个是我们必须要避免的,那怎么做呢?我们只需要用prepared statement替换原有的statement就可以了,哎,这是我们CTRLC把这个解决方案呢,在这稍微写一下说哎,如何避免出现SQL注入,诶我们这块写到的只需要用它来替换statement就行,那么下边呢,我们再讲就是具体来说这个prepare的statement,哎该怎么去使用了,哎,就这样子啊,哎,像这种SQ注入问题,比如说呢,这个大家以前应该听说过啊,就是那种。花多少钱整一个学历对吧?哎,整那学历呢,便宜点呢,比如几百块钱就行,就是给了一张纸是吧,那纸的成本很低了啊,你就是一看说诶我有这学历还是这样的,当然呢,你在学信网上相应的其他网站是查不到的,那还有一种呢,就是你可以多花点钱,我可以让你在网上查到是吧?当然前提是这个也是非法的啊,你要不是正规的这种考的也算非法的,他其实呢,就利用数据库的一些漏洞,把你的数据呢,强行给你塞进去,但塞进去以后呢,然后呢,那块一查诶一查诶确实是这个学历,但是呢,这个对整个这个官方网站里边,他还是有备份的,他更新的也会清理这些数据是吧,我我去更新一下,回滚一下,哎,你的那个数据自然而然的就给消掉了,所以还是假的。其实。
18:34
你只能是那几天好使是吧,仅此而已,那怎么就能够真的保证始终有了,就就说好好考一下是吧,拿到一个真学历就可以了是吧,再厉害的都是非法的,其实是是吧,嗯,行,这个呢,就是我们说到这个C的一个弊端。
我来说两句