00:00
哎,那整个呢,关于JDBC的内容呢,我们就讲完了,最后呢,给大家做一个总结,总结的话呢,我们开始这个资料里边有一个,呃,E达瑞写的这样一个复习笔记啊,那我们就按照这个复习笔记呢,给大家稍微串一下,哎,整个呢,我们讲的这个JDBC啊,花了两天多的一个时间,整个我们要讲的内容呢,其实都在我们这里边了,哎按照这顺序呢,我往下捋一下,捋完以后的话呢,诶,大家关注于这里边的核心内容啊,怎么叫核心内容,就是对我们后边开发有帮助的,这就是核心内容,这也就是重要的内容,当然也有些内容呢,虽然不涉及到一些相关的代码,但是也需要大家去懂的啊,这个你也得关注一下,那我们从上往下的顺序呢,给大家稍微捋一下啊,诶首先呢,我们提到一个叫GDBC的一个概述,诶概述里边呢,我们提到这样几个事情,第一个呢,叫数据的持久化,诶这个我们回到最开始的这个层面啊,诶数据的持久化呢,诶就是这样一个说明,把数据呢保存到可调电式的存储设备当中啊,以供之后使用,哎,这就称为一个持久化啊,CTRLC。
01:01
你看这个我们给他拿过来好,那么这个具体的这个持久化的话呢,我们说具体的有一些这个媒介了啊,哎,包括我们这里边列举出来的,诶文件数据库啊,其实主体来讲的话呢,就算是这两种,有的时候呢,我们也称为说还有一个叫网络。啊,比如说你用手机,像手机呢,QQ有这种叫QQ通话通讯录的一个备份,像这种啊,你说我这个数据呢,其实也存了,呃,存到网络当中了啊,那其实的话呢,你是存到这个网络对应的后台的,诶数据库当中了,哎是这样的,好,这个文件的话呢,呃,那比如说像我们具体的像图片啊,点PPG的,点tit的文本文件,哎,包括这个文件里边有一种特殊的文件叫叉L文件。诶后边呢,我们讲Java外的话呢,就需要学习这个插包文件了,那这个文件呢,既可以作为配置文件去使用,还可以作为呢跟我们前端交互的一种文件格式,对移动端来讲呢,它还可以去显示页面,诶它这个功能是比较多的啊,那么主体上来传输数据的话呢,我们使用这个杰森呢,慢慢的就把它替换了啊这样啊,当然只替换了它的一种功能啊,它呢还可以配置文件的方式呢去呈现啊,就比如说咱们写的那个C3P0点哎插码文件。
02:13
好这个啊,哎,然后下边说关于这个JDBC的一个理解。哎,关于gtp的理解这块我们也有一个描述的话说g bc Java database connect是一个独立于特定的数据库管理系统,通用的circleq,呃,数据数据库存储和操作的公共接口,哎,这样描述的。呃,稍微的可能还有点绕口呢,啊,那简单来说呢,就是JDBC啊是sun公司,这我们现在还提散公司啊,就不提Oracle了,以免呢跟具体那个数据库呢冲突是吧?哎可以简单理解为哎,就是JDVC,哎,我们说是哎S公司提供的一套接口。嗯。
03:01
一套接口也好,或者叫一套API也行啊API然后呢,诶使用这套API,我们可以实现对具体数据库的啊操作。嗯,API可以实现啊对,具体啊数据库的啊操作啊,这里边这个操作都包括哪些呢?比如叫获取连接啊,这个关闭连接,哎,然后DML操作哎,增删改查,包括呢,ADDL操作,哎包括呢,咱们在事物里边还提到了提交和回滚,哎,DC操作等等,诶这些呢都算,哎这样一说呢,简单理解为好像跟它这个长度差不多了,是吧?诶诶这呢,从另外一个角度啊,相当于我们说了一下,那由于我们有代码的支撑了,大家回来再看这句话呢,就比较清晰。诶属于这样的,那么GDBC呢,它所处的位置,哎,我们下边呢,有一个对应的图,这个图呢,我们说是以这个图为主的。
04:03
哎,这样来看啊。好,就这样一个位置,就JDVC的话,我们看到对于Java程序来讲,呃,咱们呢,写Java程序面向这套接口进行编程,我们不需要关注于具体数据库的这些细节啊,那么对于具体的数据库厂商来讲呢,它只需要呢,去提供针对于GDBC这套接口的具体的实现的集合,哎,我们就称为GDBC驱动,哎就可以了,但是这里边呢,我们要清楚一点。啊,咱们也有写代码了啊,咱们实际上呢,针对Java程序是不是可以直接通过这个红线的方式呢,去连接具体的驱动,实现对具体数据库的操作啊,这个是可以的,对吧?哎,这个是没有问题的啊,但是呢,我们为什么没这样做呢?哎,麻烦,其实倒不麻烦啊,你要这样从这图上来看的话,我来绕过你呢,不还简单了吗?对,哎主要的问题呢,就是这个可一致性的问题。
05:01
你这里边儿呢,如果出现的这些API呢,都是具体某个数库数据库的,那你回头呢,一旦涉及到数据库的一个切换等等的功能,这个里边这个代码呢,可能都需要进行一个调整啊,有的时候呢,还不是一个小的工作量啊,诶就是可一致性呢就更差了。哎,从可一致性上来讲呢,是更差了,但是呢,你要从这个执行效率上来讲呢,其实人家这个是不是要更好一些啊,对的啊,所以这都是一些相对的,对,其实哲学那里边这个呃,好坏啊,其实这个相对的就是没有绝对的好,没有绝对的坏,这个呢,其实是有道理的是吧?啊,因为你看到一个所谓的一个坏人,好像抢别人东西了,可能他随时拿这个东西呢,是因为他家里边实在太穷了,孩子都吃不起饭了,那他就可能就买点东西给他孩子了,就是他可能在孩子眼里边还是一个很好的父亲是吧,就是他很多事都是一些相对的啊,你包括呢,咱们说这个前两年吵的比较多的。正经前两年了啊呃,就是当时呢,刚起这个安卓和iOS的时候,你会发现什么呀,很多人那时候在对硬件嘛,哎,拿着这个安卓的旗舰机跟苹果这个旗舰机呢去比,说看看谁的这个硬件配置高,哎,谁的硬件配置高呢,就认为谁更好,哎事实上你会发现啊,安卓的硬件配置确实挺高的。
06:19
啊,内存的时候,那时候都达到这个四个G的时候,IOS那时候还有一个G呢,哎,但是呢,照样不影响他去玩虐安卓里边这个体验是吧?啊一个G呢,这滑的照样很顺滑,这块你照样卡啊,最后大家就发现就是那些媒体呢,发现原来呢不能这样比是吧?啊因为光比硬件,你发现上边这个操作系统是不一样的,那系统不一样呢,就会导致呢,呃,最后呈现给用户的这个体验呢,还是有很大区别的啊现在其实对于苹果来讲呢,最核心的价值就是这套系统是吧?啊就这套系统现在呢,你说拍照啊,包括它这个手机的样式啊,呃,什么包括曲面屏啊等等,它这个都没有啊,当然苹果也知道有的话会更好,但是毕竟它每年的销量呢,还是挺大的,你说苹果每年就出这么两三款手机,一出的话呢,销量多少个亿,所以他现在也没办法去用那个最新的技术,因为最新技术有它产量上不来嘛,所以他现在用的其实都是一些比较保守的成本降下来的一些技术了啊,但是。
07:19
对于其他厂商来讲,他们就敢于尝试,因为毕竟人家销量没那么高,所以他们敢试是吧?哎,这个说远了哈,拉回来就是为什么呢,这个iOS给我们体验这么好,安卓呢,要差一些,这也其实也是有道理的,并不是说呢,安卓这帮人太菜了,说不如苹果的iOS。啊,主要原因还是因为iOS呢,它是一个封闭的系统。啊,封闭的系统,那封闭的系统你看iOS大家应该也知道啊,包括Mac系统,从这个手机的硬件的设这个这个设这个手机的一个设置设计。啊到它这个相应的一些架构啊,像这个苹果这个A系列的处理器也都是苹果自己家的啊,这个硬件的设置,这个设计,然后呢,这个硬件的一个产出,嗯,包括他这个操作系统,包括这个开发操作系统的语言,包括呢,开发这个操作系统的工具全套的全都是他自己家的,那么针对于他自己家的这个操作系统这套生态呢,他不需要对外开放公共的接口了,所以呢,他只需要面向他自己的这套API呢进行编程言ID呢,就有点向我们这里边的绕过了GDBC,直接呢进行了一个数据的。
08:32
连接操作,那对于安卓的话呢,我们知道它是一个开源的操作系统,然后呢,各家的手机都可以去适配,所以它里边呢,必然会产生过多的一些接口啊,它要生成一些标准啊,然后具体的这个比如苹果呀,不是苹果这个OPPO啊啊,VIVO啊,或者小米啊,华为啊是吧,他们再去提供这些实现,所以呢,呃,对于安卓来讲呢,它更像是我们这块用GDBC这样一种模式,嗯,这个安卓呢,典型的问题就是碎片化的问题,所以你会看到最终呈现出来的效果就是,呃,安卓的这个操作系统呢,总感觉这块优化完了以后步入iOS,嗯,这没办法啊,因为这块呢,你是要适配各个厂商的这个手机,而且这里边语言呢,有很多这个硬件的话呢,又是不同的架构的,所以这里边要考虑的问题很多,哎,我们需要提供一种通用的标准,而iOS不用这样去做啊,包括呢,你看苹果本。
09:26
说实话,苹果本呢用的确实不咋习惯,但是呢,你看到以后呢,总想摸两下是吧?哎,做的确实是比较漂亮的哈,也非常薄啊,就是因为人家里边不用考虑过多的兼容性的问题,只需要针对他自己这一套生态进行编程就可以了啊,就是这个原因造成的。所以网上有人说说iOS哪一天能让这个自己的小米手机,或者是这个华为手机是不是也有可能用上呢?这一天永远不可能是吧,因为你一旦要用上以后呢,就会跟安卓一样啊,这个体验性也会很差。
10:00
好,这是这个问题,那么针对于我们刚才再拉回来啊,咱们现在要说的是GDBC的好处啊,咱就不说它的坏处了,诶好处是什么呢?诶这里边提到了两个问题。啊,两个问题就是对于我们程序员来讲呢,我们只需要呢,面向这套接口编程就行,哎,我们不需要关注这个数据库的底层细节。啊提升细节,那么对于这个数据库厂商来讲呢,它只需要呢,呃,面向这套接口呢,提供相应的驱动啊就可以了,这呢,我们提到这两点。哎,这样子啊,哎就是大家呢,就相当于是从两个角度去说啊,哎从开发哎程序员的角度,哎这个来讲呢,我们不需要哎关注。哎,具体的哎数据库的细节啊,那对于这个数据库厂商来讲,哎他呢,诶只需要诶提供诶这个标准的具体实施就行。
11:05
哎,叫或者叫具体实现啊就可以了啊,这是这个角度,然后呢,下边呢,提到叫数据库的驱动啊,数据库驱动啊,一说到驱动这个事儿啊,这不咱们当时讲课的时候呢,演示过这个图啊,就是大家呢只需要啊,只要在这个Windows操作系统上,诶你去通过USB的方式连接一个外部设备的话,正常情况下呢,都需要有个安装驱动的过程啊,有的时候呢,你说诶我U盘怎么插上没有,这是因为内部呢,这个U盘毕竟是一个常用的一个外部设备了,诶他把这个驱动呢都已经提供好了,诶但是你要是一个不常用的外部设备,比如插上你的这个手机或打印机啊,这个驱动呢,一般都需要去进行下载。啊,这是USB这一套标准的具体的实现类的集合了啊,诶相当于我们只能说叫类似于,诶咱们生活中的这样一个情况,那么对于数据库驱动来讲,那就是我们所说的不同的数据库厂商,哎,针对于GDBC这套接口提供的实现类的集合。
12:05
哎,数据库厂商针对于啊GDBC啊这套接口,哎提供的具体实现类的集合,哎这个集合呢,就是我们所谓的驱动,哎就是这个意思了。行,然后呢,下边我们提到一种思想,叫面向接口编程的思想。诶把这个呢,我们CTRLC拿过来。说GVC是上公司提供的一套用于数据库操作接口,诶这va程序呢,只需要面向这套接口接口编程就行了,啊厂商呢,提供这个接口的实现类的集合就要驱动,其实呢,就相当于把上面这话呢又给整合了一下。诶大家呢,从代码层面呢,去体会呢,就是诶我们写的这么多的代码,你要去上边看,诶相应的这个引炮的话,你不会看到任何一个API是第三方的啊,第三方的数据库厂商不会出现的啊,这就叫面向接口编程啊,就是这里边呢,你见到的凡是涉及到我们诶GDBC相关的这API啊,其实都是一个接口了,你看属于这种。
13:09
好,这个我们就过了啊,然后下边呢,涉及到数据库的连接,诶这是我们紧接着讲的一个问题,这个连接的话呢,我们前面有四个方式,这个呢,作为过程存在就行,哎大家呢,不需要去深究啊,不需要去深,你要掌握的话,你就掌握这个就行啊,就跟你谈几个女朋友一样,这都是过程存在的是吧,你也不用每年说这个,现在都已经结婚了说哎哪一天是跟这个分手的,我们再纪念一下是吧,用不着了,你就跟这个整纪念日就行是吧?哎,前面这就不用看了啊,诶最终版这个呢,是咱们自己,哎获取一个连接的一个写法,哎,第一天关于连接。在这呢,哎,或者的话呢,我们看这个JDBC也行,呃,这个这个JD bc YouTube啊也可以啊,获取连接这个呗。
14:00
诶,CTRLCCTRLV一下。字稍微有点大啊,小一点。行,哎,这就可以了,那么这里边儿呢,我们需要用到一个配置文件,哎,这个配置文件呢,咱们是在S2C响啊。在这写一下。词,哎,配置文件。哎,声明在诶工程的src项啊,这一定要注意,因为这块呢,直接影响到我们加载的时候这个路径的问题,嗯,那这个文件呢,我们也拿过来,诶最起码呢,得有这四个基本信息。或者说呢,对于我们自定义来讲,你也只需要这四个基本信息就行了,他呢没有所谓的管理可言,只有我们数据库连接池才有。好保存一下,这就过了啊,这就获取连接了,然后呢,诶获取连接包括呢,我们还有关闭连接的操作等等,那最终呢,我们实现自然改良操作,每一次都需要获取连接和关闭连接,咱这块呢,就相当于生成了一个呃,Jdbc us啊就整个这个啊,CTRLC,呃CTRLCTRLC啊这个我就直接把它全部的都粘过来了。
15:16
哎,这样一个方式啊,这个呢就不要了。诶保存一下好,这个呢我们就告一段落,就是我们能够自己呢去获取一个数据库连接啊,包括关闭数据库的相关资源,这个呢比较简单,只需要呢判断是不是no啊,然后进行关闭就行,好接着往下。有了连接以后呢,我们就,诶试着呢,可以对数据库呢进行操作了,诶所谓的操作呢,就是我们典型说的叫增删改查,那么在增删改查这块呢,我们没有去使用statement。啊,因为它有相关的弊端,那么关于stemn的这个使用呢,我这块呢,罗列出来了,诶当然大家呢,其实不用看啊,诶知道有这么个事儿,他能做这个事就行,主要呢,我们现在想谈的就是它的弊端,诶打开我们的那个课件。
16:01
哎,我们在这呢,提到这个prepared STEM的这个弊端了,哎,这个弊端呢,主要体现两个方面,第一个呢,就是存在拼串操作繁琐,第二个呢,存在搜购注入问题。啊,这两个问题,那么关于什么是售后出入问题,哎这块我们有个描述,这个大家呢,诶了解清楚就行啊。好,这个拿过来就是第一个问题呢,其实我们还可以接受,顶多呢,就是写起来呢稍微麻烦一点。哎,这个circleq出入问题呢,呃,不是这个拼串问题呢,是这样的啊,就咱们当初呢,写一个呃,String类型的一个circle的时候,哎,比如我们这块呢,想insert into到这个customers这个表当中,哎,比如说叫哎,Name,哎,Email哎,Birth,哎这样几个字段吧,哎,Y6这个呢,就该写这个值了,那我们现在呢,这个是日,呃字符串字符串这个日期,哎那么对于S库来讲的话,我们写的话都得应该用单引号给它引起来,这是一个,这是一个,然后这是一个,哎那这里边的话呢,我们正式来讲,你要说直接呢就写死了,这样写没没没问题,但是现在呢,我们这个name呢,是上边提供好了一个变量啊,就比如说你是使用new的一个scanner。
17:23
哎,system.in哎,我们提供了一个scanner的一个实例。这样子,哎,然后下边呢,你这个诶scanner第二,哎掉了一个nice方法,咱们获取了一个叫name。哎,是这样的方式啊,然后下边我就等等等了,现在呢,我需要把这个变量内幕呢给你填充到这,哎是这个呢叫做拼串啊,那我们就需要呢,先这样给你把左右两边先劈开,然后呢再诶这个整两个加号,哎在加号这里边呢,我们去诶给你填充一个内部变量。
18:00
哎,就是这块呢,叫拼串啊,这个也是一样,先劈开,然后整俩加号,中间呢叫email,诶然后这个也同样的道理,哎俩分号俩加号,哎提供一个birth,哎这样啊,这呢就叫做拼串的意思,稍微的繁琐一点,嗯,所以呢,我们就不建议这样去用了,哎主要说的是这个事啊。这是他的第一个问题,叫拼串。嗯,那SQ出入问题呢,咱们也演示过了。那输入的时候呢,咱们当时演示的是这个代码。嗯,Statement打开在这里边,诶我们当时呢,是配了这样的一个select语句。这样子,在这个语句当中,咱们呢,传入的一个用户名密码呢,是比较奇怪的一个字串了,哎,这个user呢,我传的是它。
19:00
这样。你看U传的是他,然后password呢,我传的是这个。你看,但是呢,整个这个结构传过去以后,你会发现呢,我们这个想表达的and的关系呢,变成all all了,哎,相当于实现了一个数恶E的一个呃,数据库的一个操作了,啊,这就叫做一个SQ注入的问题,行,那这呢是我们只是演示的两个问题,那除了这两个问题之外呢,针对于其他情况的一个问题,比如说我们使用这个statement。哎,Stemn呢,我们说诶没办法,诶操作lob类型的变量,哎,这是一个,哎另外呢,这个呃,Statement在实现批量插入的时候呢,效率也比较低。诶插入时诶效率较低,行,那这呢也是他其他的一个问题,诶正因为它有这样的问题存在,所以我们才引入了prepared statement去替换它,那首先呢,关于prepared statement它的一个理解上来呢,就需要指明它是我们statement的子接口,对,先要指明人家两个这个关系啊它哎是哎statement的哎子接口,那么第二个呢,紧接着就介绍一下这个接口的典型特点是什么,上来呢,就要提到它是叫对预编译,诶SQL语句的,哎就这个特点啊,CTRLC。
20:28
这个是咱们从这个官网这个API里边呢,给他拿过来的,诶这个呢提到叫预编译,实际上呢,我们说这个prepare,它的各种好处都是基于他这样一个特点来的,哎大家下来你可以想想这个事儿,哎,怎么就没有SQ出入问题了,他一开始给你俩站位往那一放,就固定了,就是谁user and password且的关系了啊又因为呢,它是这样的一个方式,你可以实现blog类型的操作,哎包括呢,批量操作的时候呢,效率更高,都是基于这个点来的啊啊是这样啊行,那么关于这个prepared sment呢,我们是通过下边几个事呢来讲的,第一个呢,就是先能够实现通用的增删改,通用的查询,呃,进而的话呢,能够解决诶我们statement的这个叫事后出入问题。
21:13
啊,我在这没写,那我就在这儿再写个三。哎,可以解决,哎,可以解决statement的,哎,SQL注入问题。啊,以及呢,我们说这个拼串问题,拼串拼床了。哎,这个问题啊,这个拼串的话呢,咱们是通过叫填充占为符的方式啊去填的,所以呢,就解决了这个问题了。好,这是我们说的这哎三个点,诶然后呢,接着的话,我们可以实现blog和更高效的插入啊就整个呢,We c我们就讲了这样几个事儿,那首先呢,是关于它通用的自然改操作,这个时候呢,咱们讲的呢,其实是一个version1.0的一个版本。
22:00
啊,1.0个版本来找一下啊,就是咱们在这个JDBC杠一当中写的这个叫a update。哎,就是这个通用的增删改操作。哎,在这儿CTRLC。哎,就他诶,然后下边呢,就是关于通用的一个查询操作啊,这个咱们是写到啊这个里了。这个呢,咱们提供了两个方法,第一个呢,是返回一个对象,哎,这个。Can it。然后来再者呢,就是返回这个多个对象构成的一个集合。That can dress it。嗯,这样啊,这个字稍微有点大啊,变得小一点。没小多少,再来一个这样啊好,那这个增删改操作呢,其实相对来讲还是比较简单一些的,查询这块呢,稍微麻烦一些。
23:04
哎,自然改,你要说麻烦呢,其实无外乎呢,就是执行这块,但执行其实也没啥啊,那对于我们这个查询这块呢,麻烦呢,就麻烦在我们关于结果级的处理上啊,也就说从我们这块开始。啊,一直到我们这块的结束,这块呢是咱们写这个查询操作呢是最困难的地方,诶这个会写了,下边呢,获取多个对象呢也不难写,区别呢就在于我们这呢是多个啊,就改成个外号循环啊,多行数据,然后分别呢去操作就行了啊那么在这个查询这块呢,我们涉及到了,哎这样呢叫两种思想和两种技术。哎,两种思想,第一个,哎对那个是一个啊先在呢叫面向接口编程思想,哎就我们这里边涉及到的都是我们诶三公司定义到这套API,跟具体的数据厂商呢,是没有关系的啊,这是第一个啊,然后第二呢叫哎orm哎辩证思想,诶对这个具体落地呢,咱们在造了一个customer的时候呢,这块提到了。
24:08
诶,CTRLC一下。哎,这样子。行,这个呢比较清楚啊,咱们就不过多的去说明了,哎,再往下呢,说提供了两种技术。哎,咱们也强调一下,嗯,主要哪两个技术能够支撑我们去写一个查询呢?对,一个呢是反射,另外一个呢,就是我们用到了叫结果级的原数据,对啊,使用结果级的对原数据啊,它叫result set me data,嗯,那我们用它呢,主要用的它两个方法,Get column count,诶获取列数,对再一个呢,叫get column,诶labor,还有一个方法叫get column name姆这个咱们都不用,对吧?哎,或许列的别名,哎这个啊哎这个别名这块咱们还说过那个具体的事儿,呃,尤其是当那个表的名字和呃,表的字段名和类的属性名不一致的时候,嗯,这个咱们当时在这个诶写到。
25:20
插曲,嗯,应该是。但是没写呢,就在我们这个order这块写的。哎,在这的时候啊,哎这样。嗯,这个我们就把这个说明拿过来啊,CTRLC。那这样子啊,这个比这个字还大。小一点。行,这个呢,是相当于我们说的这个算是第一个技术了,呃,第二技术呢,就大家刚才提到这个反射的使用。嗯,这个咱们在基础里边都讲过了啊,那么关于反射这块呢,其实我们用的最多的呢,就是两个事儿啊,第一个事儿是对创建对应的运营之类的对象。
26:10
哎对应的哎运行时类的这个哎对象哎这是其中一个操作,第二个呢,对哎在运行时咱们诶动态的去调用哎指定的运行时类的哎属性或者是方法。哎,这个呢,就是我们关于反射呢用的最多的地方啊,呃,其实呢,大家学知识你现在也发现啊,比如当时你学反射的时候呢,没有理解的说多透彻,但是通过我们呃讲GDBC,包括后边呢,我们还讲外部的内容,包括呢在后边讲框架的内容,哎慢慢的你会发现呢,关于反射的理解你会越来越透彻,因为后边呢,其实都是翻来覆去的在使用啊,就会增加你对这个知识的一个,呃,这个场景是吧,你见到这个更多的场景了,其实你也自然而然的就知道他怎么去用了啊那么这块呢,有个图示,呃,咱们给大家画了一个图。
27:05
哎,就整个这样的一个过程。这样啊,CC。行,这个呢,就展示了一个这样的一个流程,这个呢我们用的是order,嗯,特意呢,将我们这个表的字段名和类的属性名不一致啊,这块我们怎么处理的,包括这两个技术啊,这块我们都有体现。好,这就完事了啊,诶这个图呢,大家你要能自己下来拿个本自己画一画,那那基本上你就肯定很清楚这个流程。哎,这就是CRU的操作,然后接下来呢,我们使用prepared statement来操作lo类型的字段啊,那么写入啊,其实我们用的就是一个setlob,哎,这里边呢,往里写嘛,你告诉我一个输入流那就行,然后呢,诶,Getlob,哎,你需要传一个index,这呢我们就返回了一个lob类型的一个字段。这样这是第一步,诶第二步呢,你再拿着这个lo,第二我们有个get bary啊。
28:08
STEM是吧?哎,这样的话,我们就得到对应的一个叫输入流了S。哎,这呢,我们说的是核心的这样的几个方法,其实是啊,那咱们演示的话呢,一个是插入小数据,另外呢,就把你这个呃,数据表当中的呃,这个咱们当时插入的。这这是一个,嗯,这一个是吧,诶插入的时候呢,我们这个用的就是这个方法啊,然后呢,诶把它又读到我们Java程序当中了啊,相当于图片的一个下载啊,用的就是这个操作,那具体的insert啊,咱们把这个代码拿过来。嗯,不,Love在这呢。诶,这个是一个insert啊,就它了啊,诶CTRLC。诶像这个呢,其实不难啊,哎,只要呢,这个隐私的本身,我们上边也讲了增删改查了,哎,你知道那个怎么写这块无外乎呢,就是多了一个这样的一个方法呗。
29:07
理呢,本身我们在基础也讲过了啊,也不是特别困难啊,主要就是这个方法,那关于查询。诶一直到这看CTRLC,诶CTRLV诶这块呢,我们这不就用了一个诶它吗。哎,Get blob,然后get bary stream,哎,这样的方式啊,这个呢,你可以写个index,也可以写一个具体的这个别名啊都可以行,这就我们说的这个blog类型,其实这块呢,不难啊,呃,最后呢,咱们稍微提了一个小细节问题,就是我们这个blog类型,诶操作的时候呢,呃,有的时候你可以往里写的时候可能写不进去是吧。嗯,这个我们是写到上面了。嗯,在这的时候,诶这个点呢,大家稍微注意一下,哎,需要呢,我们在这个MY.i这个诶MYSQL的配置文件当中呢,加一个这样的一个声明啊就可以了。
30:06
嗯,这个我这样想。一个呢,加这样的一个字段声明,然后呢,记得要重新启动啊服务这呢是我们的一个诶注意项啊。哎,这就可以了,行,这呢是关于这个lo类型字段的一个操作,然后下边呢,我们实现一个批量插入,批量插入呢,我们又是进行了一个迭代操作啊,这个呢相是呃,相当于是有这样的几个层次哈,先是一个叫层次一,呃层次一呢,我们相当于是使用啊叫statement。来,来实现。哎,这是这个层次一,然后呢,诶层次二,哎,我们去使用prepared statement。哎,它呢,来去替换啊,Statement,那这是这个层次二啊层次三。
31:01
哎,层三呢,我们实现了,就是你不用呢,每次有一个SQL语句呢,就执行一次,哎,我们这块呢,有一个相关的操作叫I的bench是吧?哎,然后呢,Excute,哎,Bench,哎还有一个呢叫clear。哎,办式,诶这样一个操作,但是呢,为了让它能够支持啊,我们这个可以每隔一波呢执行一次,诶我们还得需要呢,有其他的几个配置。那这个配置呢,我们看一下咱们这个代码,诶insert这块。诶针对于我们这呢,说的是第三种方式了啊,诶还需要呢,多这两个事儿,这我就把这两个也都拿过来了啊CTRLC。哎,这是等于咱们这个叫哎层次三,哎这样子。哎,这是层次三了,那层次三呢,在这个基础上我们又来了个层次四。哎,这个层次呢,在三的基础之上,哎,我们每次呢,让这个提交呢,就是当你执行完一波以后呢,就不让他去及时性的提交数据了。
32:06
诶,这个我们这个四啊,设置连接为不要自动提交,哎,那这个自动提交呢,我们在事物当中啊,又体会过这个事,诶就相当于我们先让它是个false啊,要不的话呢,你每次这块执行一次,相当于呢,是不是就自动提交过一次啊。啊,一旦提交呢,他就需要给你往数据库里边去写入了啊,那这时候呢,又会比较耗时,所以呢,我们在开始的时候呢,先不让他提交,等你整个都执行完以后,诶我在最后统一提交一次,减少呢这个交互的次数来用,哎,所以也能够还提升一个效率,哎,这是这个层次次,哎一共呢,我们就是这样的几个层次哈,这个层次一的话呢,这个STEM咱们没有带大家演示了,因为咱本身呢也没有用它,呃涉及到代码的话呢,其实就是诶就是这些啊。哎,就是这块,诶CTRLC一下。哎,就这个啊,哎,然后使用prepare statementment来替换,这个咱们就不往这具体去粘了啊,这个呢,我们略是吧。
33:08
哎,就绿了,诶第三个呢,也不往这粘了,就你知道这个原理是什么就行,诶最后呢,这个层次四设置为不允许自动提交最终的一个代码展示,诶我们就把这个最后一个啊给大家粘过来。CTRLC。哎,拿到这儿这个。哎,这样一下好,这里边呢,这不有几个事嘛,第一个哎,我们赛道的commit等于false,诶不让它自动提交,然后呢,我们这里边有一个ADD bench的一个支持啊,然后bench,诶,Clear bench。啊,这块哎,当你都执行完以后啊,最后呢,我们再统一的进行一个数据的提交,呃,这呢就是我们,呃体现了这个更高效的几个点啊好,然后最后这块呢,诶在笔试的时候呢,经常会考的一个问题啊GDBC这块呢,这就是其中一个非常高频的问题,哎当然另外一个呢,就是事物这块了啊,那prepared statement与statement的一个异同,哎这个怎么去答这个问题呢?
34:19
哎,第一个点先指出二者的关系,这个咱们已经说过了是吧,哎,就是接口与子接口的关系吧,哎,这一个啊,然后第二个明确的指出来,他俩谁好,开发中咱们是不是你能做的他都可以做,哎也就是说开发当中呢,我们都是用的prepared statement啊,用它呢来去替换statement。哎,都是都是拿它去替换它了啊,就是我们就没有statement使用的这些场景了,要用的话呢,都用它。
35:01
啊,那这个,那么为什么会出现这样一种情况,什么导致的?哎,这就提到了一个prepare里面的最主要的一个特点。陈大这提到的这个问题。诶,它是预编译词口语句的。哎,就提这样一个点,那么预编译搜狗语句能体现出来什么呢?哎这块呢,其实我们以这个批量插入操作,就比较明显的能够看出二者的一个区别,哎,我们看下这个PPT课件的啊在这诶关于二者的一个对比。啊,代码的可读性可唯护性啊,这个呢,呃,就是猛一看感觉稍微有点虚一样啊,哎,那你想我们拼串的话呢,你看起来也比较麻烦,哎,那我们通过填充占位符,诶其实呢,可读性呢,应该是要更好一些啊,那么最主要的就是我们能够使用prepared最大可能性的提高性能,诶之所以能这样做啊,就是因为它有一个预编译。哎,包括下边这个防止色Q注入啊,这都是算主要的这个点啊,诶那么它有一个预编译,这时候就提到了,它会在编译完以后啊,被我们的数据库服务器呢,诶缓存起来,当我们有100万次的执行的时候呢,执行的都是用的你缓存的唯一的那个带占位服的circleq,而statement的话呢,得每次执行一次呢,都得重新去加载一遍,重新做一套这个事儿,所以呢,Statement呢,执行起来就非常的慢,哎就是这个问题。
36:28
嗯,好,这个复制一下来放到这,这个呢,就是主要他们二者的区别,哎,其实说白了啊,就是我们preparement的主要好处就是基于这个点来的啊,你没有这个,呃,有障碍符的这个关系呢,是user and password,这就固定下来了,所以它能够防止咱们举例的那个搜Q注入,哎包括呢,你能够去插入blog类型,也是因为呢,你能够set方式传一个流啊,你要是statement呢,它就不没办法在一个字符串里边给你写一个文件啊,不靠谱了,行,哎,大家呢,用自己的语言呢,诶把这个捋顺一下就可以了啊。
我来说两句