00:00
我们来写代码,看一看我们这个配置的效果到底是什么样的。笔记,那哎哟,这个笔记咋变成这样了呢。Not。编码的问题吧,UTF杠八。OK。下一个我们要说的是。呃,实际。编写代码。好的。这个没变码没变编代码我们还需要搞一个什么呀,还需要搞一个DAO。那这个整个的这个业务要求呢,跟上边讲事物的时候是一样的,所以说我们干什么呀,我们把这个接口给它,接口给它复制过来。Service里边有两个接口,CTRLC。不老。
01:01
DAO里边应该也有两个接口。看到。我不叫这个名是吧。应该是事物里边的,这里边的book DAO跟book啊。跟cassia。啊,就一个不DAO对吧,就一个不DAO。OK,把这个复制过来。没问题。好的,下边的话呢。我们先来实现这个DAO,搞一个。
02:01
C。Imple。Tickle。好啦。这里边我们用的是harmlet,那这里边儿会有一些小问题。第一个问题就是我怎么用哈,那我怎么用哈。嗯,我们说用harmlet的话呢,我们需要用到harmlet的session,那我于是的话呢,我写一个方法。Session,好了,Get session,先return now,这个session应该如何获取呢?我们注意到。我们这个是DAO,很显然。我们不能通过。Open session的方式对吧,应该通过什么呀,叫get current session,那har时候我们说过获取跟当前线程绑定的session,所以说这里边我们加个什么呢?我们搞一个。
03:13
三身起来,这个家伙是现场安全的。然后呢,获取跟当前线程绑定的session。Get current session OK,获取跟当前线程绑定的session。和当前线程绑定的,但是好了这样做,然后里边就可以去写一个一个的方法。那同学在看其他视频或者看其他书的时候,我们可能是用了什么呀,比方说harmonict模板类,我来简单的写一下啊,Private permanentletlet,那有可能是这样,有可能这样用的是吧,为什么不这样用呢?我说一下。
04:08
大家想。我的这个类是不是呀。啊,而且还是什么呢,它还只支持哈姆三四里边还没有。奥斜杠,没有啊,还只支持HARMLET3,那即便是HARM3的话,我们也不支持大家这样用,为什么呢?大家想啊,我这个DAO用的是harmonlet里边搞了一个润的API过来,你觉得好吗?那我要是使用原生的这个harm API的话。我这个dau是可以移植的。什么意思呢?就是没有了spring的话,我一样用在harm姆原生的环境里面,你要是加了的API的话,那它。
05:01
必须得有spring的环境,同时还有har的环境,导致了这个DAO的可一致性就变得差一些,所以说我们不推荐这样使用,不推荐。使用这个东西。Harmony time。以及什么呀,我们知道还有一个叫。Imp。前面是吧。叫什么let?Go support这个也是三的,那用这个和这个道理是一样的,我们不推荐使用它们。实际上的话呢,这个到哈姆四的时候,你看到他已经被废除了是吧,因为。这样会导致DAO。
06:03
和three的API。进行耦合。可移植性变差。可移植。兴趣。变差,OK,这个的话呢,只需要做一个了解就可以了,就是我们用的话,我们这么用是吧,搞一个session factory进来,然后get current session就可以了,当然了,我们这块用的是注解,这里边我们需要配置一个自动什么的包,配自动扫描的包。Component com点。Harmon到这。回来。好吧,下面看如何写吧,第一个是什么呀?根据ISBN去找书啊,去找书的单价,写一个string的HQL等于。
07:11
Select。b.price fromb whereb.ISBN等于问号。搞个query吧,Query。Query等于点create。Query HQl.s string 0is点返回query点。Unique result应该是一个类型对吧。搞定。好,第二个。呃,更新书的库存HQL等于update book b set b点。
08:11
Stock等于B点。减去减一吧,一次只买一本嘛,Where b.ISBN等于问号,然后是get session.create query sql.set string 0sb.CU update,搞定。但这个的话呢,之前也需要去做一个验证,验证什么呀,验证。书的库存。是否充足?同学们问是吧,你前边用JDBC的话需要验证,用herme也需要验证吗?
09:04
也需要验证吗?这跟用JDBC跟哈有区别吗?问题是这个数据库买circle,它不支持那个检查约束,所以说你还得验证。写吧,钝的h KL two等于。Select。b.talk from book。B。b.ISBN等于问号。Inch。等于。Get session.create query HQl.site。零。isbn.un result。
10:01
强转。If,如果这个等于零,我就抛一个异常出去。Conception。把这两个异常给它复制过来。两个异常呢?还有一个bookstore。New book except叫什么呀?库存不?OK,底下这个是一样的。HQL等于。
11:00
呃,我们先来进行验证吧,好吧,验证余额是否足够。验证余额。是否属狗?Select。a.balance。From a where a.user name等于问号。Enterprise等于get session.create。Hql two.s。N0。price.result如果。不是price啊,是什么呀。Balance。如果balance。Balance。
12:00
小于price进行一个强转,我就抛一个异常出去,Throw new。Exception叫什么呀?叫余额不足。好的。余额不足。Ctrl c o有什么问题吗?I handled type。哦,我这应该是考错了是吧。大家看错了吧,我们这个名啊,不叫他。不,奥特奇杠看一眼哈。优点空,嗯,这个是我们有什么余额。辅助同学说这个异常和那个异常有有区别吗?这个是运行时异常,那个是检查时异常。
13:09
哎,区别就在这好了,正常string hql等于。A a.balance。等于A点。Balance减去问号where a.u name等于。问号,好的。我们进行一个更新。F。Inch。For query。HQl.S0。
14:03
price.set1user name点更新好了,搞定。这个写完之后的话呢,我们再看我们的service。很显然这两个色是比较好实现的,对吧,我们直接搞到它的。第一个。搞一个他的。At service。Private book so at out。
15:00
进行什么操作呀,进行这个买一本书的操作,首先得到单价。Guide。What?Find find好,单价ISBN,然后呢?更新书的库存。然后更新用户的余额。写完了很潇洒,因为这个前面我们已经写过了哈,好,再看一个。Cancel。我们讲这个是为啥来着。为的是那个叫在测试那个事物的传播行为的时候讲到它,对吧。哦,这忘写了Cathy。
16:05
哦,接口是吧。拿进来。At service。Private book shop。住进来at auto。Well for循环。Is。B。FBNS。Books service.update呀。错了啊。Nameme,好了。嗯,我这个事物的话呢,没用那个transactional,为什么呀,因为我在这个里边已经进行配置了。
17:07
在这你看这个时候这上面是可以加的,看到了吧。好,下面的话呢,我们可以来进行测试了,测试一下。T。哎。首先。Public world test book shop service。At。首先搞进来吧,Private。拨开so。Service。等Ctx.get ban books of service.plus。来。Books of service点。P买书啊,第一个我买一个叫AA书啊,1001,当然我需要去数据表里边需要加一条记录哦,这个什么呀,是忘加这个SH这个下划线了呀。
18:17
我修改一下哈。下划线加一下。我把这个数据表的话呢,先删除。或者说我直接加一下吧。因为我别的没变对吧。诶,好了,矿1AA前呢。嗯。300。好。E。Java s bn1001。单价100。
19:02
库存十本2ORACLE。1001002。其实。石板。好的,我开始买书。那我这个余额的话呢,我给他调成150,这样的话呢,他能够买一本对吧,而第二本书是买不成功的。我们过来看一下这个测试吧。找一个。除了一个叉没过去。说什么呀,说这个account是没有经过映射的。哎哟,说这个account没有经过映射看一下哈。
20:02
最里边我们在进行。这个更新的时候的话呢,我们用的是。看一眼,哎哟,多了一个O,看到了吧,Account,那这个也得改。这个名字实际上不改也可以哈。但是我们出于这个呃,要求完美的这个心态,需要改一下。当然。他需要改那对应的数据表这块也改一下吧。F2去掉一个O。好的。这个时候的话呢,应该OK,再测试一下。还有问题。叫空指针异常,看这一行。嗯,用用户名去查balance,我这个参数叫用户名user name再来。
21:08
睡醒了是吧?再来。好,测试通过看一下。哦,我这个数据表名重写了是吧。Open。50没问题,书少了一本,OK,好了,我要再买的话,钱充不够了呀,他应该会抛出一个异常,而且。而且我们这个钱数也没扣,这个库存也没扣,是吧,这不就是是不是的事物吗。看一下效果。走。好的。有一场叫余额不足,看这个没扣拿过来,哎,这个也没扣,如果没有事物呢,如果没有事物呢,我们找到配置文件。
22:10
如果我把这个事物要是去掉的话。应该怎么样?这个时候就应该是库存减一余额不变对吧。走一个。好的。哦,No session found for current thread,就是这个时候这个实验做不出来,为什么呢?啊,这块我们需要跟大家解释一下。我们之所以在这个service里边。我们之所以在这个DAO里面说差了哈,我们之所以在这个DAO里面。我能够使用这个叫get current session。这个是跟。
23:02
Spring的事物相关的什么意思呢?关一下我们一个,我们从头说,我们看我们调的方法呢,实际上是四维的方法是吧,那我现在这个事物加到这个上边了,那应该是这样的一个步骤。在。事物开始之前获取session。然后把session跟当前线程绑定,开始事务。在这个事务方法结束的时候,如果没有出现异常,提交事务关闭session,把当前session跟线程解除绑定。如果出异常了呢啊,回滚事务解除绑定关闭session,听清了吧,过程说一下。嗯。事物的流程,事物的流程第一个。
24:02
叫债。方法,开始之前干这样的几个事儿。第一个。获取session。第二个把。Session和当前线程绑定。这样就可以在。DA中使用三。Fe的GA。Current session方法来获取。三。开启。二若方法。
25:01
正常结束即。没有出现。异常,则流程一。提交数二。十。和当前。线程绑定。的session解除绑定。三。关闭session。好。三若方法出现异常。若方法出现异常,当然我们这个方法指的都是什么呀?业务方法则一回滚事务。
26:04
好,这两个是一样的。好了,这是我们整个的流程,所以说我们看到呢,如果把这行代码去掉的话。它怎么了,它连session获取不着,那我们那个实验我们就先不做了,我们通过谁来做呢?我们通过它来做,因为这里边我们还可以看到那个事物的传播行为,对吧,OK。来看事物的传播行为测试。Public vocab CA。把开搞进来,Private开等于now。开等于Ctx.get bin。
27:00
ca.class好的,我要调CA的圈号的方法,AA。两本书s.I list。两本书,1001和。1002。At。两本书我的钱呢,改成两本书,我可以改成300。好成整数加一起170,所以说我第一次买都成功,第二次买的话呢,一本也成不了是吧,默认情况下,好,我先找一个看效果。OK,看。呃,八九没问题。一百三好,第二次买的话,默认情况下一本也成不了对吧。
28:05
再看。除以偿余额不足。130。八九,那如何能让他买成第一本呢?我们需要设定事物的传播行为。这里边儿呗。搞一个什么呀,搞一个事物的传播行为。TX method方法名是哪一个呢?是我调的那个方法是他。这个我要求是有一个。Propagation,我需要一个什么呀?我需要一个新的事物,叫require new OK,再来。能买一本。第二本书钱不够,刷新八变成七,好的钱变成30,看到了吧,这样的话呢,我们确定哦。
29:11
Hat这个生命事物已经用上。那以上呢,实际上就是我们spring整个harmonlet的全过程,关于配置的话,那在这个,嗯,上一个视频里边的话呢,我们已经讲到了,这节课我们主要是通过代码来进行测试。
我来说两句