00:00
来,我们接着看。现在呢,我们回到我们程序当中去,注意看啊,下面我要开始写代码了,我们就写在PRO20这个里边。现在。我在。这个当中。这边有个叫我在这边新建一个。我新建一个类叫open。Session in view filter。我写了这么一个类,然后我让它实现filter。然后重写其中的三个方法。你把它写一下。Web filter。他拦截新点路行吗?同学们拦截新点路就这样。这里面代码怎么写,咱们先不管它,先放一遍,那其实这里面代码咱们要写的是什么呢。稍等啊,回到这个图。走到这,我们要写的是不是就这这边的代码呀。是吧,同学们其实就这边的不着急啊,这个代码其实很简单,不着急。
01:04
那么我们要想在这个当中写代码,我们要想完成设置啊,或者叫开启事务啊,提交事务啊,回滚事务啊,好,我们把它封装成一个类。我们封装成一个类。好,我封装一个类叫transaction manager。我写了一个类,叫transaction。这个类当中给我们提供这么几个方法,第一个开结束。Public void begin transaction。第一个方法。第二个方法。提交数。Public public。Void。好,这是第二个方法。再来第三个,叫回滚术。回滚。回滚十。Public void。我就写了这么三个。
02:01
好,这是我们的trans manager。再来。下面我应该怎么做呢?我怎么去开启失误呢?那肯定是connection.set auto commit呀。我怎么去提交事务呢?那肯定是connection点,我怎么去回滚呢?那肯定是connection点。所以说。现在的问题的焦点就挪到了connection怎么获取。你说老师我在那边传一个。传个connection。也可以,这是我们面向对象的方式。我们在这个里面,我怎么做呢。我怎么来做呢?我这边有个叫private。Local。Connection。好,这个叫local,等于new local。
03:01
然后他。他。这边点get。获取到一个connection对象。啊,获取了一个connection对象,我们去判断一下,Connection不等于now。啊,他是个不等那的状态。Set,我们把它改成false,不要让它自动提交。就这样的,要圈开启一下啊,咱们路子吧,对外路子。啊,如果你不等了。咱们去auto。那else?如果你为了,为了不行。为难,我们要重新获取,要重新获取个connection对象。好。我们怎么写呢?我怎么去获取呢?我们以前connection对象是怎么获取的?同学们。我们是不是在写在best里面?我们打开看一下。Best。
04:00
我们在best丢里面。我们是不是一个叫get connect方法呀?哎,就是这样的,当然我们这边采取的是加载驱动啊,通过驱动管理器获取连接,如果我们把数据连数据源连接池拿进来,是不是就通过data source就get connection啊。啊,这个无所谓。好了,这是我们获取连接的这么一个方法,那我们怎么调用呢?我们怎么来调用呢?下面呢,我在这边写一个叫connection。You。叫connection的一个工具类,或者叫con。啊,我写了一个connection的一个工具类。在这个工具类当中。Public static。Connection。我们可以get connection。我们写一个方法,这个方法能帮助我们去获取connection对象。
05:02
它可以帮助我们去获取connection对象。那么获取connection就和这边长得差不多。从这。我们我们先拷贝一下啊,暂时先拷贝,根据C到这边来。根据V把它粘过来。我们把它粘过来。然后我们想要去获取connection对象,我们怎么获取的呢?把这一段CTRLC拷过来放到这里。把它粘过来。Driver,呃,这是这是一个静态的是吧?呃,那我上面这个是非静态的。行吧,先改一下吧,Static you see。我就写了一个叫get connection这个方法。假设你能跑到外面来,那肯定就嘛。这没什么好说的。好,我就写了一个叫get connection。我再回到我的trans里面去。
06:00
如果你为空为空的话不行啊,Connection u。点get connection,我们要获取一个connection对象。然后把这个connect对象把它设置一下。然后再把它放到thread local里面去。Connection。那这个代码有点挺烦的,重新写一步,重新写一下if connection等于等于啊,如果我一上来就判断你是否等于空,如果你等于空就获取嘛。Could you see。获取完之后就设置进去。啊,然后在外面你肯定是不为空了,咱们就设置一下行。Could you see。You wait。是吧?好,就这样,那下面代码删掉了。我们就把它改成这样了。这就是我们开启失误这么一个操作。再来。下面一步是提交。提交的话一样的。先获取connection对象。如果等于等量,要执行这个事情,CTRLCCTRLV。
07:06
Connection点。Committee。就这样吧。再来back也是一样的,上面的代码都一样的,所以一会我们再修改,慢慢来啊,一步一步来。点入。思路。那大家会发现我这三个方法里面这些步骤都是一样的。这个步骤的目的是什么?目的不就是想获取connection对象吗?那我要想办法把这些内容全部都塞到这里面去。全部都塞到U里面去。因此来,我把它放旁边啊。大家如果听的这个速度感觉有点快的话啊,这个课下的时候再去看视频。好,这是代码,我一步步把它变过来的。现在我再回到U里面去注意看啊。
08:00
现在。我在看U里面,我把这玩意儿剪切挪进去。啊,我把它挪到这里面去。然后你这个get connection方法怎么办呢。好,这个three的local呀,嗯,它是这边是静态方法是吧,它这个不是静态的,这样吧,我先简单把它写成studio。然后get connection方法。我怎么做呢?这个get connection方法怎么做呢,注意看。剪切。拿过来,放到这儿。Connection等于它如果你等到哎,等等,那就不是这么操作了。把这个删掉。好,我把这坨代码剪切。剪切,我在这里面专门写个方法。Private。这个叫。这个叫create,我写叫create,把它进来。然后如果你得点了。那么connection就等于create connection是真实的去创建一个connection对象吗?
09:04
创建完之后再把你扔进去。啊,再扔进去,最后return.get。啊,再再再给你再获取一次。就这样子。好,这个get connection我就写好了,因此我这个begin这边我是不是就不要去考虑这个能不能获取到了。我就直接写。U。点get.set auto是吧,我就直接写这句话了。C。费。对吧。平均能看得懂吗?我就把它变成这样了。好,这是我们的transaction manager。我们这边不要去考虑太复杂,既考虑这三个技术的啊,但是我不说大家估计也想不到。比如说我们事,我们两个业务方法。啊,当我们碰到两个业务方法。
10:01
包含的时候,那么我们应该怎么办?我们要把当前外层的业务方法,它的事务要不要挂起呢?Spend。内部的这个方法要不要重新开启个新的事物呢?还是说我内部这个方法和外面的这个方法啊,叫合并成一个大事物呢。何必到人家外部的这个事物里面去执行呢?等等等等,这个我们称之为叫事物的传播机制。咱们先不考虑这一套啊,估计说的大家大家也听不懂啊,后面我们讲框架的时候还会再提到。啊叫事物的传播机制,我们因为现在事物管理是我们自己去写嘛,咱们就不写那么复杂了啊,就简单的处理一下就可以。那行。再继续。其实啊,同学们,我这个connection里面,我这么叫,我这个叫get connection,我这么去改动之后啊。那里注意了。同学们,其实我们的best。稍等一下啊,Best do,我们找一下PRO20是这个吧,就是它。你这个best deal里面这个get简历就不能这么写喽。
11:03
是不是啊?换掉,我们得写成什么?Connection有点get一下。是不是?我们就得改成这样了,改成这样之后,请问一下这玩意儿还要吗?不要了,删掉。啊,这边我们就把它写成get connection就可以了。然后呢,我们这边有close,注意看啊。这边有close方法。这个close方法你看啊,我这个执行update之后,我这边要执行close。我这个查询之后,我要执行close。我这个这是什么单个查询的,我也要去执行close,现在还能吗。你如果在第一个do里面,你把它,那不就完蛋了吗?是吧,因此。这个close方法。稍等一下啊。这个方法这里面那个代码全部删掉,我就下面代码我就不删了,你调用我的close方法是不是这里面是空的呀,啥都没写嘛,你调用等于没没调用,能听懂我意思吗?我就把它把里面代码把它删掉了。
12:05
好,Best do先关掉。再继续。这个trans manager我已经写在这了啊,开启事务提交回滚,那行,咱们回到open session in里面去。咱们回到这里面来,初始化方法,不管destroy,不管看这个。我们在这边写一下,再次看一下那个图啊,不是这个。被我关掉了。关掉了啊。就就这个图是吧,Try catch不接这个吗?那行吧。怎么回到这了?刷开启。Exception。好,这边咱们可以把异常打印一下啊。那行。在这里面怎么做呢?首先trans。
13:02
我是不是用它的开启事物这个方法呀。那我这个犬在选它这里面这三个方法啊嗯。非静态的是吧,咱们可以把七是不是可以把它写成静态的啊。先完成功能再说吧,Static ctrl c ctrl v ctrl v,就这样的,我把它写成静态的了,再回到这边来,Transaction manager.begin transaction。是不是?然后下面我们要写的是欠。点do filter对不对。把它写进去放行吧,放行是不是就表示哦,放行过去你要执行service方法,Service里面要执行什么DA对不对,那你执行执行完之后是不是再回到我们四的要响应回去啊。所以这就执行完之后,我们要transaction。慢点commit是吧,Commit,那一旦你中间这句话有问题,是不是就会被开启到了。开启到之后transaction manager点。啊,我们执行一下back,那这个乳back方法,因为有抛异常,咱们抛一下啊,这个地我们就圈开去吧,就就。
14:07
这么去写吧,啊,这个代码有点丑啊,就这样吧。后面我们要把这种呃,把这个地方的这种所谓的呃,编译器的异常,我们可以把它转化成运行式异常。好,暂时先这么写吧,好了。这样我们就写完了。啊提交,然后这边是回滚。当然了,我们这个connection,我们当前操作完之后。稍等一下啊,我们回到选manager里面去,好这个地方你不是拿到connect对象,然后commit了吗?Commit完之后你可以把这个connection可以把它关掉。能听懂吗?你可以把它关掉,所以呢,我在这边写一下。等他。好,Connection等于点。好,然后呢,我在这边我可以写一下。啊,connection.c是不是可以关闭啊,关闭完之后我们可以写three local,也就是connection有点。
15:02
它里面是不是当前只有一个get connection方法呀,我们可以再写一个set方法。啊,或者叫close connection方法就不要直接用它的close。目的是什么?目的是从当前的ad里面把这个connection对象移除掉。所以我再回到connect里面去。我们写了一个叫get connection,我们再写一个。Public static。Connection。啊就就word就行啊,我们写一个叫叫close connection。几个方法。叫。然后呢,一样的。获取到。啊,这地方先get。如果你等等于,浪等于等于,那我就什么事情都不做。本来就没获取到嘛,没获取到就登不就完了吗。是吧,同学们就直接写个就完了。我们写一下if connection is closed。加感叹号是表示你是打开的状态啊哦,如果你是打开的状态,我connection.close是不是要把你关闭啊。
16:07
然后的lock.set now。能看得懂吗?我写个闹。哎,这就是我的close方法,那行吧,这边要去。啊,咱们写个思路好了。再回到这边来,那请问一下我这边是不是就可以直接写connection,有点close connection没错吧,不需要传任何参数,就这样的。同同样的,道理也是一样的。Could you see。到这边来就飞。点回滚一下,回滚完之后close。那么我们回到这里面来,所以我们就直接调用commit或者调bag都可以。啊,就是这样的。我们来试一试啊,看看行不行。
17:06
让我看一下啊。这个可以关掉。Transction manager。心电度。稍等一下啊。就是。嗯,我们再找一下service层啊,把它可以关掉了,找一下service。设备。我们要故意的在一个方法里面调用,调用多个do方法啊。稍等一下我们的查询呢,查询应该是应该是这个。啊,不过没有关系啊,没有问题的,我的controller controller当中有个index方法。Index index方法里面用了设的两个方法。啊,用的是不是两个方法。嗯。应该没问题啊,应该是没有问题的。我们来试一试啊,因为当前我们已经不是一个service的问题了,我们是多个service啊,全部把它合并成一个一个一一个事物啊,我来想一想啊。
18:07
Filter control,然后我们的index方法。我们index方法里面这边一个service调用啊,这边一个service调用。那么在它之前,我们过滤器。拦截开启失误,执行完这些操作之后啊,回来的时候再进行提交,那也就意味着这两个service里面用的connection应该要同一个。啊,应该是同一个。那行吧,我现在回到社会市场。三回到这。那么我现在呢,我就需要在这个方法。还有我们一个叫get page count是吧,我在这两个方法里面,我把我的那个连接对象把它哈嘛,把它打印出来,看看是否是同一个。老师,你为什么要验证是否是同一个呢?我验证的目的就是想看一下这两个人如果用的connection相同,是不是就表示同,应该是处于同一个事物啊。如果你用的可险不一样,那不就完蛋了吗?
19:00
好,就这样,那行吧。我们在这边看一下。有点get是吧。我们在来get一下,它就能获取到这个connection点。就直接打印吧。行不行,同学们。我就直接把这个connection打印出来,那是不是会带有这个哈奇库的码呀。好,我们这边写一下啊,当前当前咱们这个方法是叫get fruit list里面的对不对。可以把这开单先打印出来。还有一个是。看这个方法。行吧,拷贝一个。再回到这边来。Get a page count。好,我们来看一下啊。OK,我们来启动一下,呃,然后呢,我们在,我们在哪里呢?我们在。这边也叫begin transaction。我们在这边写一下。这个叫开结束。
20:01
开,结束。好,这边我们写一下,这个叫提交数。然后在这个地方呢,我们叫回滚术。行不行,同学们。好,就这样子,好,我们在这边写一下,看他会不会给我执行这个东西。坚持一下啊。呃,这个好像这个rifect我没有稍等一下啊,点它点击prot structure,找到rifect这玩意删掉,咱们加个PRO20。二零这个打开。点击应用,点击OK。把它设置进来删掉,加一个二零没错吧。PRO20没问题。
21:03
好,这边可以把它改一改,我们这个就改成二零。我们应该访问的是底度吧?是福了,点读吧,没错啊。再启动。射击。到租界。好了,那么这边首页面已经访问到了,没有出错是吧,咱们看一下控制台,重点是要看一下控制台啊。
22:04
要不这边咱们把它先清掉吧,重新来一次行吗,同学们?弗罗迪多翘灰尘。你看这。两个是不是一样的,开启事务,执行这句话,再执行这句话,然后提交事务吧。那说明他获取的connection是同一个。啊,获取到的是同一个,哎,就是这样没问题。啊,这是我们成功的情况。我们也可以故意抛个异常,让他失败一次。行吧,同学们,我们就可以来试一试啊,来。我怎么做呢,注意看啊。嗯,我们现在要完成添加。啊,要完成添加功能,那么这个添加稍等一下啊。添加我就故意的在这边写一下啊,艾特添加,我添加文件是想让他添加两个行不行,同学们。我让他添加两个。啊,这是一个爱的方法,我们service层会定用这个do的这个爱的方法。
23:02
要不这样吧,我们这边调用I的方法,我们再故意写一个调用update的方法。然后我们可以试试让爱的这个方法能够正常执行,然后我们让阿布报错。看我们执行成功的第一步能不能有被回滚。能听懂我在说啥不?啊,应该能听懂啊,再来,所以我在这边写一下float do.update float,我们可以把fruit放进去,但是这个我可以去。应编码写一个行不行?我就硬编码故意写一个啊,再来找到我们数据库,数据库没打开是吧,打开一下啊。药膏。当然这个数据库大家也可以在ID里面啊,咱们ID里面也可以,连数据库有个专门的窗口也可以。好,我们找到的DB打开。打开打开打开。好看一下啊。西瓜六六十六,咱们就改这个数据行不行。
24:00
Fruit do.get fruit byfid2号码。FRUIT2行吗,同学们。然后我们把这个2.setcount,它本来是66库存嘛,我们把它改成99。行不行啊,同学们,然后听好了,我故意的在这个二倍的方法里面报错。能进了吗?我让这个方法里面报错,回到这个update。我们可以在这里面去抛个异常。我们可以在这个当中去抛一个异常。或者你把这个语句写错了啊,不对的。都行吗?你写错之后,它是不是会抛一个circle exception啊,它会告诉你you have a error啊,什么什么circle,什么text,你的circle语句的语法也错误,然后near在什么什么附近是吧,同学们。就这样。那行吧,阿,报错了啊。那这个方法报错。就会导致我这个update报错。但是我上面这个艾和这个get应该都是能成功的。
25:02
我们现在所期望的结果就是因为他的问题会导致上面这个添加也会被回滚掉。能听懂他说什么吗?OK?注意看啊。我现在把它重启一下。好,启动。我们回到这个图,稍等啊,我们来新建一个。好,回到这边来。打开大。好了,现在在这个地方。啊,咱们第一个方法,咱们执行的是ad。Fruit。稍等啊。叫艾特。我们执行的第二个方法是get。Get fruit。FID。是吧,同学们,我们执行的第三个。Update。
26:00
但这个方法出错。是不是那出错,我们就看一下到底是这一个被回滚,它执行不成功,看前两个能不能也被回滚掉。是不是这样的?我们就看有没有添加进去。回到这边来,咱们直接点他。添加一个吧。2023这个应该没有。单价四块。库存49。然后备注。就写这个吧,添加行吧,同学们咱们试试啊。我现在把控制台全部都清掉。全部清空。好,点击添加。哎,交成功了。加成功了吗?看一下啊。开启术。这边有个提交数,我感觉有点问题。只要你出现提交事务,我就感觉不对劲,我这边要执行的是回滚事务,不应该是提交事务。
27:02
开,结束。这是之前的。啊,这是之前的这个是什么,这个是不是首页啊。这是首页啊,在这个地方提交数我觉得不对。啊,这点是有问题的。你看这边报了个错误,You have error是吧,也有个错误。啊,他说这这这一句有语法错误。好了。这个错误呢,隐藏的稍微有那么一点点深啊,这个错误不大好发现。啊,我举个例子啊,举个例子。比如说啊。我们以前是吧,以前某一个。煤某一个煤矿是吧,发生了这个爆炸。啊,发生爆炸,然后这个死伤多少人是吧。然后咱们这个这个我党是吧,中央咱们需要去去查这个事情是吧,这个地方把这个新闻给遮盖了,掩盖掉了是吧,说没事没事,这个矿难这个引起十个人受伤,没有一个人死亡是吧。哎,这个给给隐藏掉了。
28:00
那你想想,这样的话,我们上面是不是就发现不了问题了。因为你即使你这个内部。你报错了,但是我通过开启。给你开启主给你抓住,抓住之后,然后对外宣称没事没事。那是不是外面外层的窗开启还能开启到吗。不能吧,外省的开启肯定就开启不到了嘛。嗯,能听懂我在说啥吗?我内部的圈开启已经给你开启到了。那你外部的圈开启就开启不到了。哎,就这问题。啊,这个例子举得不大合适啊,我党万岁啊。好,现在咱们这个应该来说,这个各种反腐啊,各种抓的力度还是还是还是挺好的是吧,这个社会就应该有,就应该有正能量是吧,好。OK,我说的是以前,不是现在啊,以前确实有这样的例子嘛,是吧啊。现在没有啊,不要瞎说啊,我党万岁啊。来,我把这个过程再给大家再解释一下,请问一下DA1 da2 do3里面是不是都有圈开启。
29:04
你这个方法出错,你出错的时候,我在这个地方踹。啊,我这个大括号就不写了啊,在这边开启。T啊,被看见到了,看见到之后我说了一句,没事。是不是,那请问你在这个service这边TRY的时候,圈开能不能开几刀?你就看不到了吗?是不是同学们你这边开启啊,这边得不到任何的信息。啊,就是说抓不到信息啊,抓取。不到任何异常。因为人已经被人家内部处理了。啊,已经被内部处理了。所以。我们现在要做一件事情。我们所有的低层。不要再出现圈开启了。还记得吗?我们不要再出现,出发开启,全部向外抛,全部都要向外抛。
30:02
因此我们来改造一下,坚持一下啊,还有一会儿我就讲完了,还有一会会儿我就讲完了啊,坚持一下把它停掉。讲完之后,正好大家可以点外卖啊。所以大家这个尽量不要干扰我,一干扰我,我一开小车我出bug是吧,一调半天这个大家得12点点外卖是吧。回到我们do层,DAO,我们找到best do,稍等一下啊,Best do在这。我们best队伍里面,你看一下我是不是充斥着大量的圈开启啊,我们会有很多的圈开启。我们全部把它向外抛。所以这玩意儿我们可以对外抛。把它拿掉。所以这个方法。我们对外炮。再来。Get connection不管他,Close,也不管他,我们就找看去。好,这边一圈开启扇。
31:01
删掉。删掉。串删掉。行。从这到这。然后呢?是不是对外思路走没问题,下面方法圈开也是一样的对外思路。删掉。我这边这个改动比较粗暴,全部是对外路,按道理来说,我们这边要封装出自定义的异常。我们在不同的层要设计不同的异常。啊,这样别人才能知道到底是哪里出问题了啊,再比较具体,这边不管了,全部比较暴力啊,全部向外抛。这个是XQ的,叫Cory,执行查询TRY拿掉。回到这边来,全部删掉。好,把它向前缩进一下。好思路。
32:02
就这样的。好,这个是不是在这边补一个。是吧,同学们啊,OK。这是一个单个查询,TRY删掉。从这到这里全部删掉。然后这个地方close也不需要了是吧,不需要了啊。好思路自己想。OK。类似的方法也一样的,踹,把它拿掉。从这到。全部删除。到这个地方。没问题,思路。全改完了吧。
33:00
那么这是我们数据访问层,我已经把它全部向外抛了,那数据大家想象一下,想象那个层次啊,第在最下面。他向上抛,是不是抛给service?我们看一下float do。Float丢。这里面咱们应该没有缺钙体吧。是不是啊,所以他就报错了嘛。哎,没问题啊,行。按道理来说,我们这个方法你要向外抛,抛的是什么呢?抛的是我们的float exception。啊,我们可以在这个地方,比如说我可以在这边,我可以开启。我可以在这里去开启。然后呢,开启导,我把这个开启全部合并成一个。合并了一个。然后在这个里面,我可以再对外思路。New,比如说fruition。啊,叫do层出问题了。
34:06
我就写个叫float do层出问题了,那么这个异常现在是不是还没有啊?哎,我们可以去新建一个。Flute。新建一个。Exceptions,把它放到这里面,叫float exception。好,我让他继承。Run time。运行是一场咱们加FC学过的是吧?行,Public float do exception。Message。啊,Super message有没有有没有这个,哎,有的啊,蒙对了,说明他构造方围里有这个带参数的啊,Message就这样的。那么再回到这边来,我们就列出一个float do exception。啊,就一下就可以了,只要我一旦出问题我就路嘛。可以了吧,捕获了异常之后,我就进行思路,这是没有问题的。再来下面一个方法,也是一样的。
35:00
这个漏的方法也有问题。我们去开启一下。好,从这到这。回到这边来。然后思路。CTR c CT you。假设你跑到外面来,是不是啊?有没有问题啊,哎,怎么还有问题啊,这边十个应该可以的是吧,没问题啊,就这样。再来下面一个是不是也是一样的呀。再来。Exception。Can you see。其实同学们你这边圈开也可以,不行你可以继续向外抛吧。也行的。啊,也是没问题的,如果大家觉得老师你这个写的好烦啊。你看你每个方面都要敲开去,这太烦了。没关系,我们可以在这里面。如果大家觉得很麻烦的话,我们可以在这个里面。我们可以进行操作。啊,这个方法不管它往下走,我们有哪,我们有哪几个方法呢?注意看啊,一定要看我一步一步思考的过程啊。
36:04
不能光不能光看最终结果再来。我刚说了。我在第层啊,我操作这些玩意儿,如果我本来以前这里面代码写的好好的,我觉得蛮简单的。现在你全部给我用圈开,就把它包围了,我觉得好好烦。窗户是不是没关啊?把窗户关一下啊。所以呢,我们要怎么做呢?来。我在这个地方,在best do这个地方来注意看啊。回到这边来。找到我们的best deal。归到这里面来。啊,我在这个地方,我来写个叫do exception。EXCPT啊,DA exception写个他,我把我之前的float他。直接继承拷过来CRC。把它放到这边来,Deal except。把它放到这儿。就这样的。那这样的话,我直接在第在best do里面处理完是不是就可以了。
37:03
哎,就是这样。所以因此你注意看啊,注意看我的变化。如果大家觉得这个do啊,这样写很复杂。我再全部清掉。稍等一下啊,稍等一下,现在还原回来了吧,没问题了,我现在已经把它还原回来了再来。回到我们的best do这一层。第一个方法叫update。没关系,我可以先不对外思路。注意看,那你这边不就报错了吗。报错我就去看去嘛。开启可以了吧。那当然你这个衣服里面开起这个挺挺挺不好的啊,直接看好了。从这边开始TRY。一直到这个地方开启。是不是?Exception。啊,或者叫exception都可以啊。
38:02
好,可以在这边打印一下。然后再对外再跑。思路。New do是不是?然后我们写一下。我们写一下啊,Best do。然后XQ的啊出错了。是不是这样的?我们可以对外抛出这个异常,哎,就是这样。啊,然后里面的代码我再重新把它再缩进进去。可以的吧,同学们。就变成这样了。那你这个return count为什么会有问题啊?正常在这边或者在这边死路,要不你要不死路,所以这玩意可以删掉。是不是?我又重新把它还原回去了,但是还原回去和刚刚有点不一样,我即使把我之前的异常全部都转移成变成变换成这个玩意儿了,是吧,同学们就变成它了,这边为什么还报错?哎,其实很简单,同学们,因为我们执行的路径当中,肯定会有一个路径没有执行return或者没有执行。
39:00
那你看一下这边有个if,如果进到这个if,并且进到这个if里面才有return,否则是不是就没有return了,补一个吧,Returning是吧,同学们这样就搞定了。再来。这个方法暂时先不管它,再往下走。Complex。这个。本来我们要对外exception。好,我们开一次。TRY。Catch。Exception或者叫exception都可以啊。一点。好,然后思路。六拷贝吧啊。拷贝给you see。好,放到这边。就这样的。然后我把这些代码从这到这剪切全部挪到这里面去,是不是全部把它挪进去没错吧。
40:00
好了,写完了。再往下走。漏的方法是不是也是一样的?我们把后面的全部清掉。全部都删掉。然后呢,这个方法里面我们执行一下TRY。Catch。Exception。好拷贝一下啊。You。平均拷贝过来,然后从这开始一直到这剪切,把它挪进去。OK。啊,捕捉到异常之后,我就直接对外。好。下面方法也是一样的。把后面的线全部杀掉。因为大家不要觉得这个老师你这个写的很麻烦啊,你怎么一会删,一会一会加上一会又删掉的,这是一个过程。啊,反正现在还不需要你写嘛,现在是我在给你演示嘛,啊,所以这个大家如果自己去一会一会儿加一会删,大家可能会搞错啊,但我这边不会的啊,大家放心好了,你直接看啊。
41:02
好,TRY。Catch。Exception。好一点。然后。看一下啊,啊不行。是。Can you see。V。好,从这一直到最后剪切,把它挪进去。OK,搞定。就这。那这样的话,我就把它改完了。啊,这样的话,这个best丢,我就把它全部改完了没问题。那行,我们再回到float do。Flu里面你看一下X没问题,漏没问题,X update没问题,Delete ADD这些应该都没问题,那这边为什么还报错呢?我们看一下点它。看到了吗?为什么?因为刚才那个best deal,他的constructor上面是不是有个异常啊,点进去看一下那个方法我没改,点进去你看一下也就这个方法,是不是一个思路子啊。
42:10
没错吧,这边一个思路啊,这个方法是有问题的。所以我们的洛do啊,这个上面我们要要去重启一下。啊create啊,你需要把它重写出来啊,思路这个异常。但如果大家觉得这个也比较麻烦的话啊,如果你觉得很麻烦的话,那这个地方你就这么简单处理吧。这边一个思路。把它删掉,稍等一下啊删掉。就是这句话报错的是吧?刷开启。一旦你捕捉到异常。我们对外思路。Copy过来。
43:09
可能的原因是没有指定监括号中的类型。有同学犯过这个错误吧?啊,你在实现在继承它的时候,你小结后面忘写了啊,肯定有同学犯过的,写成这样了是不是啊,那写成这样是有问题的啊OK。再来。那这个当前这个best do应该差不多。后面我这边是直接复制粘贴的,我这边全部是写的update,但不一定。要不我改一下吧。省得这个咱们会把咱们同学搞晕了啊,把这个改一下吧。出错了。再来,这方是漏的。回到这边来叫漏出错了行吗?同学们我改一下啊。Good update。Update,好,请。
44:01
我改完了。那改完之后。那么我回到我具体的这玩意,其实我就可以不要了,因为它我暂时没有用到,把它删掉。再回到第五里面去。他继承它,实现它,然后直接执行其中的方法,没问题吧?好,我们再回到service service里面,我们应该是没有对异常做处理的吧?是吧,就是因为我们以前在best里面我们进行圈开启,圈开启是不是外面就捕捉不到了,现在虽然我们有开启,但是不是我们重新对外抛了一个新的异常。泡的新的衣裳外面也是能够捕获到的。所以service层没有补货,我们再回到ctrler层,Ctrler层我记得我们应该也是没有补货的,是不是啊。去了没有补货吧?再来,我们再到dispa里面去dispapa dispa。在这儿。它里面是有开启的。我们看一下啊,在这个地方是不是有串呀。
45:02
然后呢,咱们这边是有开机,我们把这边需要改动一下,内部不用看啊好把这边改动一下。哎,直接开启,开启到之后我们再对外再思路。六啊思路六列出一个exception,我们写一下,我们写个什么exception呢?叫Dis exception。我们写一个。好,就回到这边啊。我们新建一个叫dispat。第四。Exception。然后让他继承runtime exception。然后我们就。好,四军message。Passage。然后回到这边来,我们这边就思路。Dispat。
46:00
So that exception。我们写一下啊,出错了。选C。好,这是我们对外抛的一场,那请问一下同学们,你这里内部有错误。内部的错误是因为咱们第层故意抛了一个错,会被开启到吧,开启了是不是又对外抛了一个异常啊,那么你抛了一个异常,抛了一下是不是过滤器里面就能开启到了。那这样的话,咱们过滤器才能够真正的识别到有错误呢。啊,之前的情况是识别不到的,现在这个开启就能应该能够捕获到了。我们现在再来看一下。最后三分钟啊。我们来看一下啊。
47:00
所以我们刚才的过程,请问一下刚才那个萝卜有没有加进去啊。你刷新你看看。应该是可以加进去的吧。是吧,因为部分成功部分失败嘛,是吧,这边肯定是没问题的啊,那行再来我们把这边全部清掉啊,当前肯定是没问题的,因为我们这边做的是查询首页嘛,行继续啊。添加。2024。好。88。好。好像听懂了是。好像听懂了啊,挺简单的。好,就这样吧,添加一个。哎,这次你看没有到首页吧,它出现一个大空白啊,出现一个大空白页面行。咱们看一下报错了呗,是吧,你看PA来的时候报错了,他报错是因为best deal里面的X的update报错了。他报错的真实原因是因为you have a。再往上走。再往上,再往上,是不是you have an error in your,这是真实的原因嘛,但是我们一层一层的封装,我们把这个真实的错误。
48:08
我们把这个真实错误封装成一个叫best。叫best do里面的这个运行是异常,然后它又被捕获,又重新封装成Dis是吧?同学们又封装成这个异常叫Dis exception,那么这个一场最终被我们的过滤器给捕获到了吧?你看这边报的错误啊,稍等一下啊,过滤器你看看到没有open session in view filter。对吧,同学们,你看也就他出问题了。啊,他出问题了,他说那是因为内部出问题了。好,所以呢,我们此时会有回文。稍等一下啊,你看是不是啊。一开始你看一上来开机数,开机数本来要执行嘛,先执行at嘛,音色的嘛,那音色的肯定执行完了嘛,紧接着我执行查询嘛,Get嘛,Get估计也能执行成功嘛,然后再执行update嘛,结果update update少了个字母E是吧,少了个字母拼错了哦,出错了。
49:06
所以这边就是用的回滚,那咱们回到数据库看一下。萝卜2024有吗?没有。就是这样的。啊,这样我们就能完成一个叫编程式的一个事务管理。其实我们后面啊,我们学框架的时候,我们还会再去学什么呢,叫配置式的事务管理。其实原理、思想都是一样的,只不过现在我们是通过代码来做的事务管理,后面我们把这种代码啊,太烦了,我们把它转移到配置文件里面去,我们把事物的管理规则、管理策略全部写到配置文件或者写在注解里面。那就是所谓的叫配置式的。行,咱们先说说这么多啊。
我来说两句