00:01
JDBC当中呢,还有一个小的细节,我就在这个项目里面把它说一说就可以了。呃,是哪个小的细节呢?我们JDBC当中啊,除了driver manager之外,其他的都是接口嘛。啊,其他的全部都是接口。那我想讲的是什么呢?我想讲的是这个叫prepared statement。这个叫预处理命令对象。预处理命令对象。那它为什么称之为叫预处理命令对象呢?预处理它有一个叫预处理的过程,为什么需要预处理?我们这个prepare statement,它有一个负接口叫statement。啊,本来我们执行搜狗一句我们可以使用statement是可以的。那么它下面有个子接口。叫prepare statement。这个子接口下面还有一个子接口叫coral。
01:03
Statement。啊,这个是什么,这个是执行存储过程的。啊,将命令对象执行存储过程的。那咱们什么叫存储过程,咱们还没学呢。你就简单的认为我们数据库当中存储过程啊,数据库当中的存储过程相当于Java里面的方法。一个一个的方法就行了。啊,就就先暂时先那么简单的认为,如果说我们想要去执行存储过程,我们可以使用call statement。那现在我们最常用的就是我们的。那我们既然有statement,为什么还要搞出这个叫prop statement呢?你比如说我给大家写一个给大家看一下,大家只需要做个了解,不需要掌握啊。好。那么我在这个地方呢,我把我之前的代码呀,我把它拷贝一下啊,嗯,加载驱动获取连接搜狗语句,好就到这吧。
02:02
我把它放到这里面。OK。第一步,Class for name,我们要加载驱动嘛,是吧,同学们。第二步,我们要通过drive manager.get connection哦,我们要获取连接对象,那行吧,这个连接对象啊,执行批处理,这个可以把它删掉。然后呢,我们有一个搜狗语句。比如说select。Selection t fruit。比如说whilefid的一个值。哎,本来我是这么写的。这个问号表示占位符吗?那其实早期的时候不是这样的,同学们,我们早期的时候可以在后面加个变量。这是没有问题的。就这样的,就要根据fid进行查询,所以我可以在上面定一个fid,比如说等于二号。那请问一下这个ID是不是就拼接到这边来了。好,那这个so后语句我可以这么来执行。S。
03:00
Statement。好,这个对象点create。我们可以去创建一个。然后他有个方法叫XQ的Cory。XQ的扩把四口语就把它放进去,那么它会给我们得到一个result set对象。哎,就是这样。那没问题啊,我们在这个点,我们就写个if呗,Is next。如果有数据的话,我们就把它打印出来,比如说。呃,咱们第一个fid,咱们就不获取了,我们就直接获取FM。格斯郡,比如说FM。好,答应一下。再来比如说r.get比如说价格吧,价格应该是第三列。啊,第三列我们把它打印打印一下。好的价格,那比如说我再打印,比如说库存啊,第四列或者叫F的都可以。还有备注s.get string。好,备注mark。
04:04
这是非常正常的操作,我们运行一下。只要你这个idfid等于二号只要存在是吧,那肯定就能查询到,我们看一下能不能查询到啊。有的吧。啊,确实可以查询到。但是大家要注意个小问题啊,大家要注意个注意一个比较小的问题,我这个是根据ID查询。它是一个整数啊,感觉应该来说感觉好像问题不大,那那假设我这边我不是根据fid,我重新换一个STEM,等于比如说我写个苹果可不可以,或者这个长城是什么,是西瓜是吧,那行吧,我写个西瓜。那我这边写个FM。好,这边把它换成FM,我重新换一个。那请问一下这样是不是也可以啊,没有问题啊,执行一下呗。那这个西瓜咱们把ID也打印出来啊。s.gET1。我们试一下。稍等一下啊。阿诺卡,稍等一下啊。
05:02
FM应该没问题啊,再执行一次。啊,怎么还报错了呢?阿诺看了吗?他说,西瓜怎么是一个裂?哪里有问题呢,Select星他will FM等于注意了,哎,他怎么认为是这个西瓜,怎么认为是一个列呢,是一个卡呢,你要注意了,咱们当前是字符串,所以这个地方呢,我们最好加个单引号。然后在到后面再包围一个单引号。我们用问号的时候,好像就没有没有考虑到这种小的细节,因为咱们直接是一个粘尾符问号就可以了,是吧,现在我再来执行一下。我们看一下它是不是就能查出来了,这是第一个小小的问题,就是我们如果使用statement,你看你如果是数字的时候,咱们看不出来。但如果是字符串的时候,你看你还得专门去拼接一个,拼接一个单引号。表示这里面是是括起来的嘛,表示它这个字符串嘛。
06:01
啊,这是第一个比较麻烦的地方。第二个比较严重的问题。我们一起来看一下。比如说。这个我把它注释掉。FM等于西瓜。我后面加单引号。然后OE等于一。啊,我写个OE的e ofid或者FM等于。再加单引号。大家帮我看一下。变成这样之后,要不这样吧,我让大家看的更清晰一些啊,让大家看得更清晰一些,我在这边把搜狗语句打印出来行不行,同学们。我打印出来给他看一下运行。好了,你看一下这个四口句c select的新,它where FM等于它OE等于一,请问如果我的表里面没有西瓜这个数据,请问我能不能查到结果?
07:01
为什么可以?这是哦,这是或者吗?或者我写了个一等于一啊,同学们,我写了个一等于就表示恒成立啊。那这样岂不是说你假设我们这个不是西瓜,假设是人家卡号,什么账号名称,什么密码,你想想和密码还有关系吗?和密码就没有什么关系了,我们是不是只要保证前面一个卡号,我随便输入个值,但是我后面紧接着我跟上了,跟上的时候OE等于一是不是很成立啊。大家能明白这个问题吧?所以这是拼接字符串所存在的问题。这种我们把它称之为叫注入式漏洞,因此你看我把这if改掉。我改成wow。那这个是我一运行。你看一下。是不是所有的数据都能查出来啊?那可不是说光查询你一个人的数据了,所有整个表的所有的数据都被别人给窃取到了。啊,这个是史上比较有名的叫注入式漏洞啊,是因为一个黑客是吧,他懂这个东西啊,懂这个技术,然后他就把这个把这个信息啊,全部都窃取到了。
08:07
后来咱们这个技术才慢慢做更新,才出现的叫prepare statement。啊,所以说这个STEM它是个负接口,它是存在一定的问题的。存在。注入式漏洞啊,它是存在注入式漏洞的,一般情况下不使用。好,所以说刚才我们刚才我写的这个API,大家只要能够了解一下。啊,就可以了。其实我们这个STEM它不仅有这个注释漏洞的问题。包括我们往数据库里面去存储一些大数据对象的时候,他也会有一些问题。啊,我指的大数据对象,比如说二进制的,我把一个图片,我把一个MP3文件,我把一个压缩包文件,我把一个电影文件存储到数据库里面去,注意不是存储到磁盘,是存储到数据库。
09:01
这个我们称之为叫block数据。是吧,叫binary binary叫二进制格式的大数据。或者。是不是character,是不是字符形式的大数据啊?比如说一篇长篇小说,我想存储到数据库。啊。那这个时候我们如果想使用STEM,你就没有办法,没有办法使用了。啊,它会存在这样的一些问题。好,所以正常情况下我们就使用prepare statement就可以了。有一些企业里面还会用到这个东西。啊,有一些写之前呢,有一些企业呢,它做了一些规定,就是我们的Java文件里面不允许写SQL语句,所有的SQL语句必须得封装成存储过程,然后在我们Java类里面进行调用,啊那这是我们用Co用的是比较多的。Cor大家暂时也不需要了解啊,因为存储过程咱们还没学呢,后面还有数据库的高级部分啊,我才会学到这个东西。
我来说两句