00:00
哎,前面的话呢,我们把这个使用repair statementment进行的相关的数据库的操作,咱们就算是告一段落了啊,然后简单的回顾一下,呃,那么我们一开始讲DBC的时候呢,就先提到了一个叫数据库连接,诶毫无疑义呢,这是我们这个操作数据库的一个起始点,咱们这块呢也有一个图,咱们从这个图呢再来回顾一下啊,这个导入SQ包是必须的,你看你到底是,呃,这个搜Q包其实不用导了啊,这个本身是咱们这个S公司里边定义的,咱们在这个JDK里边,呃,其实已经包含了就是这个JDBC这套相关的API了啊,主要呢,我们需要导入的就是第三方的这个大包,哎,根据你操作的是MySQL Oracle还是其他的一些啊,都需要呢,进行一个第三方驱动的一个导入,导入以后呢,我们对于程序员来讲,咱们是面向JDBC这套接口进行编程的,哎,我们引用了叫面向接口编程的思想啊,然后呢,诶,我们导入驱动以后,加载驱动实现了个连接,这是我们要做的第一个事儿,也是大家落地需要掌握的第一个事儿,就是能。
01:00
能够手写一个连接啊,至于说呢,你是连的Oracle MySQL,套路是一样的,唯一的区别呢,就是我们去换那个配置文件就可以了,那么创建好连接以后呢,正常来讲,下一步我们就需要呢,呃,写相应的S后语句,实现对数据库的增删改查等操作了。当然这里边咱们广说了叫c rud啊,C rud呢指的就是增删改查操作,咱们写了通用的增删改和查询操作,没有写那个DDL的操作。DDL创建和管理表对吧,比如我们去create一个table啊,包括修改表的字段啊,包括我们后边再去job table啊,这个没有写,那其实呢,这个DDL操作呢,大家也可以也可以去做的,因为我们创建和管理表的这些操作,包括删除表的操作,其实他也没有相应的返回,对吧。你创建个表是不是有点类似于你增删改一样,对的啊,所以说呢,DDL这个操作大家你就使用我们的,诶增删改用的那个通用的方法,那个SQ呢,你就改成DDL的这个circleq语句啊实现就可以了,下来大家自己可以测试一下啊,那么这个我们讲这个CR操作的时候呢,没有讲这个statement啊,因为呢,我们讲了statement以后呢,马上也会不用它,诶咱们替换的都是prepare statement,诶当然这块呢,写statement没有问题的,因为本身prepare的还是属于它的一个子接口,对吧?哎叫子接口了啊那么这里边呢,其实也有一道面试题,这个面试题呢,就在问说prepared statement和statement在呃对数据库进行增产改造操作方面呢,嗯,你进行一个对比,哎,等一会咱们简单的说一下这个事情啊,咱们还接着把这个事说完,那么我们用的是prepared statement,咱们呢,诶这个一开始呢,叫预编译S语句了,那么接着呢,你把这个张元符呢填充一。
02:49
以下下边呢分成两支,一类呢叫更新,这个更新呢,是一个广义上的更新,包括增删改操作,哎都叫更新了,因为这类操作呢,是没有返回的啊,那么当然也有返回,返回的话呢,你可以用那个e update返回的是你影响的那个行数。
03:07
但是那个不像我们说查询一样,是出来一个结果集了,就是增删改操作呢,相对来讲要简单一些,那么对于查询来讲呢,我们一定需要一个result set结果集,然后处理结果集,最后呢,你关闭结果集的对象,对于增删改来讲就没有结果集的这回事了,最后关闭我们prepared statement,关闭connection,哎,最后结束操作,这呢就是整个我们这样一个流程,这个说完了,那么增删改查我们使用prepared statement实现了通用的这个相应的操作了,然后后边的话呢,我们相当于又那讲了一下,说使用prepared statement来操作lo类型的字段,这个用statement是做不到的,然后呢,我们还可以实现一个叫批量插入,批量插入的话呢,其实statement也能做,只不过呢,咱们当时是迭代过好几次,通过这个呢,来看到我们到底怎么样实现对数据库的,哎,批量插入操作的时候呢,效率更高啊,这个是需要我们关注的一个问题啊,那么回到刚才说的这个问题,总结一下说prepared statement和statement进行一个对比啊,这个在笔试当中呢,出现。
04:07
看过这样的考题,面试的时候呢,也问过,也问过,那这个问题该怎么去答呢?说他俩你对比一下。嗯,其实呢,就从我们讲的这几个事呢出发就可以了,那首先呢,这个statement啊,跟prepare STEM这个关系要指出来,这呢都是咱们这个散公司JDBC这一套接口里边定义的这个规范,也就说呢,它不是第三方的啊,这个都是三无司定应的,而且呢,它是两个接口啊,我们操作的时候呢,都是面向接口编程的了,同时的话呢,这个prepared statement呢,属于statementn的一个子接口,对先把他俩的关系呢先明确一下,那既然子接口呢,他们做的事呢,其实就算是一样的事了,那么对于STEM来讲啊,它就是用来传送SQ语句,诶到我们数据库里边来进行操作的,就像我们说的,这它就相当一个信使一样啊,专门呢去携带那个SQL语句到数据库当中,数据库服务器当中啊,去执行那个SQL语句的啊,是这样子的。
05:10
你像咱们这个,呃,前面呢讲数据库这个先装的是数据库服务器,后边呢,我们是导入了一些包,呃导入了一些这个测库文件,里边有相应的一些表啊,那么我们就是通过这个搜Q要的一个客户端写的这个SQL语句,咱们呢是把这个搜QL语句呢,在这个数据库服务器上呢,来进行一个解析执行,然后最后呢返回的这个结果,只要呢,我们现在操作这个关系型数据库呢,咱们都用的是这个SQ语句,那现在的话呢,咱们是在这个Java程序当中,希望呢来操作MYSQL数据库,那这时候呢,虽然是Java代码,整体来看是的,但是呢,你肯定是仍然用的是SQ来操作的。你要说我们用Java程序本身就操作,那我们就没有必要去讲这个circleq了,所以呢,本质上来讲,我们去操作数据库中的表仍然用的是circleq,只不过呢,是把这个SQ呢嵌套到我们的Java Java程序当中了,那怎么嵌套体现这个嵌套关系呢?诶,我们在Java程序当中这个circleq呢,就相当于是我们的一个字符串。
06:05
我们得想办法呢,把这个字符串呢,给他送到数据库服务器这块帮我们去执行。嗯,那谁来送这个事呢?这就是stemn来做的事,获取连接以后,然后stemn呢,作为这个信使,然后他就诶过来了,把这个搜后送过来,然后这块去执行,这就是STEM它的一个作用。那就先指出来它的作用,那它的作用其实也就相当于是它的作用了,因为它是它的一个子接口,大家做的事是一样的,OK,那么下一步,那我们在开发当直接呢就点出来,我们都不会去使用statement的,我们要用的话呢,都是使用prepared statement啊,使用prepare statement去替换statement,实现对数据库中表的增删改查操作。啊,其实这块呢,也间接的说了,他也能做啊,我们只是说呢,用prepare来替换它来做。OK,那为什么要期望他来做呢?这里边儿就提到了这个STEM呢,它有两个弊端。
07:02
他类弊端呢,就是我们在上边这块提到的。嗯,在这呢,对这个一个呢,我们说要存在这个拼串的操作,哎,稍微的繁琐一些,但是这呢还可以接受,另外一个比较重要的问题呢,就是它存在一个色后注入问题,这个问题呢,是我们一定要避免的,那正因为我们要避免这样的问题,所以咱们才会使用prepared STEM去替换STEM,实现通用的增删改查操作。啊,这个呢,就先说出来这个事,然后除此之外呢,我们使用prepared statement呢,还可以实现,呃,对lob这个字段这个操作,而我们statement呢是做不到的啊,什么没了,屏幕没了,再重播一下啊,有了是吧,可能是因为我刚才摸了一下这个水晶头。嗯,所以他就怂了哈,行,再说一下啊,这个prepared simment呢,除了刚才说的这个增卡之外呢,说它可以实现对lob这个字段的一个操作,那为什么这个STEM做不到呢?其实这里边有归结为就是我们有一个预编译嘛,呃,预编译搜Q语句的时候,你看我们这块写的都是这叫战略符了,然后我们再去set的时候呢,比如这个占碍符,它表示的就是那个lo类型的字段,诶我们就可以通过一个流的方式来去操作了,但是你想你要是写一个正常的一个色后语句没有障碍符,这针对STEM来讲了,你里边你你说你写啥,只能说我们写个变量型,你说写一个文件,文件你不能直接把文件就怼上去,必须以留了方式去操作了,那你这块写个流,哎,不合适了,所以呢,诶对于STEM来讲,它就没办法操作lo类型字段了啊,这是这个事,诶另外的话呢,又提到我们叫批量的一个这个插入数据。
08:48
哎,批量插入数据的话呢,诶不是这啊,这批量插入数据的话呢,我们使用preparement的这个更高效,那么这时候翻回来又说为什么会更高效呢?因为哎,我们preparement呢有一个预编译,其实也正是因为预编译,我们才能够解决这个circleq注入问题,那么这个预编译呢,你可以进行一个解释啊,咱们其实之前也都说过了啊,就是因为我们在生成prepare DEMO的时候呢,直接是调的连接点prepare STEM把那个SQ就放进去了,放进去以后呢,就要预编译了,所以呢,它就会被我们数据库服务器呢给缓存下来,那如果你要是执行这个缓存下来的这个搜Q语句执行了100万次啊,那这时候呢,它就只相当于是仍然调用了你之前存在的那唯一的一个,没有进行过相关的一些校验了。
09:32
啊,而你要用STEM的话呢,你要输入100万次,每一次的SQ,因为不一样,所以每次都进行一个校验,包括这到内存中的一个加载,这个呢效率就非常的差了,所以诶这个呢,其实我们所有prepared simment它的好处都是基于它预编译这样一个特点,所以大家呢,应该对我们诶这个API文件当中对这个prepare什么的这个说明。哎,STATEMENT1上来呢,就提到说这个对象,它代表了一个预编译的circle的,诶statement应该有一个深刻的理解,他的刚才提到这些好处都是基于他这样的一个特点来的,OK啊,这呢就相当于是我们的一个简单的一个小结啊,那么到我们这块就是操作完那个block类型批量插入以后,诶这个前五章说完了,这算我们的上篇结束了,诶今天呢,咱们来说这个叫下篇,也可以说呢,我们上边这个操作呢,都是为了我们下边这个操作呢做储备的。
10:29
啊,做储备的,今天呢,我们要讲四个事儿,哎讲四个事,第一个事数据库事务,第二个事真正对我们后边开发有用的话呢,我们要给它封装为相应的一些类,哎去调用了,这呢,我们提到叫DA及其哎这个相关的这个子类啊,包括也涉及到一些接口等等啊那么下一个叫数据库连接时来替换我们这个讲这个VC1上来说的那个手动的获取连接的事儿啊,然后在最后一个事使用阿法提下的一个叫DB,一个JA包,JA包里边呢,提供了主要的一个类叫做que rener,使用这个类呢,来替换咱们自己使用prepared sment写的那个增删改查啊说了半天,就是前面讲那些都是为了今天做准备,或者以及呢,拿今天那个去替换我们之前的一些操作的,OK,那么重要性上来讲的话呢,应该都懂是吧,哎,今天的内容呢,就比较重要一些了,那我们。
11:30
首先来看第一个事叫数据库事务,哎叫数据库事务,这个数据库事务来讲的话呢,相对来讲是我们这个章节里边呢,算是一个重点内容,那么以后的话,我们讲这个MYL高级的话呢,还会再提一下这个事物,哎,包括这个项目当中,我们还会应用这个事物,这个是毫无疑问的,那么是一个重点,同时呢,这也是咱们首次来讲这个事物的概念,它也有一定的难度啊,就是重点和难点就兼具了啊好,那下面呢,咱们就诶看一下这个事物上来的话呢,这块有些描述,这个咱们先不看,先通过一个实际问题,我们来引入这个事物,好的,那这块呢,我们就直接回到咱们这代码层面,那既然是咱们这个下篇了,咱们就再新建一个工厂啊,这里边这个也不少了啊,新建一个工厂。
12:16
这叫JDBC杠二这个啊,嗯,在这里边,嗯,要想做我们这个事务操作呢,得先保证我们这有连接了,所以连接呢,还得依赖于咱们这个之前这个提供的这个手动的连接,想想我们要想获取个连接,这里边都需要准备一些什么事,嗯,咱们呢,把这个连接操作呢,都封装在jdb CU us里啊,所以这块我们首先新建一个包。那这个一了啊,嗯,U这样,然后把咱们之前那个g d b c us ctrl c给它粘过来,嗯,好粘过来了,粘过来以后呢,我们这里边有个链接,但是这连接呢,你要想调用它的时候呢,能给你返回一个对象配置文件得有。
13:04
哎,你看我们这块连接都需要哪些东西,配置文件的话呢,我们放在SC下了,因为这块我们是通过这样的方式来来导的,哎,默认的就是src下的,然后呢,我们这里边呢,使用的这个Java plus,你得把相应的炸包导进来,在工程下点右键。去哎,用一个folder,我们叫lib,然后把咱们之前的这个JA包这个咱们就用这个新的了,5.1.37CTRLC,诶CTRLV导进来,这时候呢,一定要进行一个诶,Build pass,嗯,对,这样才行好了,那基本上就可以了啊,那么有了这个,嗯工具类以后,我们这里边呢,提供的是一个获取连接的操作,还有关闭资源的操作了,先来做一个测试,再新建一个包,这个呢是咱们用来说这个事物的,事物的这个单词大家要记一下。Transaction,对啊,这个单词呢,就是表示叫事物的意思,Finish好,在这里边呢,首先我们来测试一下,刚才这个连接呢,靠不靠谱,我新建一个专门的测试connection的一个测试。
14:19
好,这个我们调用的叫jbc u,第2GET一个connection这样啊,打入一下这个LT,诶CTRL1把这个异常的L一下,在CTRL一来得到一个链接,打印一下好保存来测试。嗯,没有问题啊,这块呢,相当于我们这个链接呢,就回到了,嗯,行,那这块呢,稍微的再多说一句哈,这个前一天呢,大家在敲代码的时候呢,学生问,哎,当时呢,我刻意的没有说,哎到这块呢,我们提一下就是在我们整个呢,讲解这块的内容的过程当中,我们也看到有很多异常都需要进行处理了,那有的异常呢,我们使用的是check family,有的呢使用的叫ROS,比如说针对于咱们这个gdbc us里边我提供的这个get connection,我这用的就叫做ROS,有同学问说,诶老师为什么这块不用track finally呢?嗯,那比如说你用了是吧?呃,我用了track开finally以后呢,其实对于这个来讲没什么问题,就相当于我们把异常呢,如果真的出现以后呢,给处理掉了,关键就是你要是处理掉以后,我们后续的操作呢,可能会有点问题,比如说咱们使用这个prepare sment实现这个通用的增删改查操作的时候,咱们就以这个查询为例,这咱们写这个通用的查询操作了,那么我们调的这个get connection,你是使用的track finally来处理的一场。
15:43
那如果真的这个这个连接没有获取到,你把里边的异常是不是都给开始住给干掉了,那干掉以后呢,就会导致这行代码呢,如果真的出现异常里的话啊,你已经给处理掉了,这个代码实际上是还可以往下走的,对吧。哎,但是他真正要往下走的话呢,你想没有连接,你再去获取一个preparement本身也不靠谱,诶对,所以这块呢,就是程序呢,本身在这里边已经出问题了,他再往下走就没有意义了,所以我们建议呢,就是一开始在这里边呢,就不要去try catch放里了。
16:15
呃,这也是咱们讲基础的时候提到过,说我们什么时候应该try cash,什么时候应该throw当中的一种情况,就是我们在整个这个操作当中,比如这个没方法了啊,或者我们最终的一个测试执行的一个程序了,在这个程序当中呢,我们会先后执行好几个方法。先后执行好几个方法,那么这每一个方法定义在这,他们呢,各自里边呢,可能都会有一些异常的出现,那么建议呢,就是这里的三个方法呢,都选择叫Rose。诶,他们都选择叫roses,然后在整个我们这个操作当中,我们把他们都穿起来,这时候呢,你这个异常因为roses出来了,所以他们这块都会报这个问题了,我们统一呢进行一个传开。哎,这样这样保证的话呢,就如果上一个操作呢,真的出现异常以后,我们就直接蹦到cash始这块,后边这两个就不再执行了,嗯,因为本身这三个方法呢,它是递进操作的,前一个出问题了,后边呢,本身也不应该执行,所以呢,我们就不要给他们分别去拆catch,你要都拆catch的话呢,这个异常已经被你catch住了,它就会又蹦到下边,又蹦到下边又出问题了,又蹦到cash里边,一定要重复操作,所以呢,我们这块呢,哎就都选择这样的一个方式,哎,那我们这个get connection呢,其实就是这样的一个想法,我们就给你抛出来,统一的在我们最后呢,你进行一个,诶测试的时候,这个方法的验证的时候呢,我们进行操作,同时的话呢,你看我们这里边因为还涉及到资源的关闭了,所以我们在这呢,肯定是要用TRY开了,我们这块呢,就不用再去Rose了。
17:43
哎,就这样个情况,行,那么这个连接呢,我们就回到了。
我来说两句