00:00
好,接下来啊,就是我们今天的重点中的重点了啊,今天这一上午啊,老师把这两个四四杠一和四杠二给你搭出来啊,搭出来之后我要求大家通过今天上午如果有剩余的时间。我给你们留做练习,如果没有的话,那就得加上中午,今天上午必须得给我打出来一班现场打。OK吗?好,My bet啊,结合倒层的开发,也就是说对于咱们以前那个MVC。对吧,模型这一层啊,其实指的就是咱们这个持有层道层对吧,好,那么我们现在啊。将原有的啊以接地BC开发的这个层给它重构成什么呢?用MY开发倒层,OK吧,倒层是不是就是接触数据库的,这个没悬念吧,OK啊好,这个搭建有一个过程啊,需要大家注意力高度集中啊,因为流程稍微多一点啊。
01:11
行,咱们再新建一个model啊。这个还是啊,来个六。耐克斯特。我们来一个零二。干什么呢?MYBAT。零二啊。这里边儿东西粘一下啊,这个其实你这个复制粘贴项目,从这个硬盘里边做也也行啊,但是我想这个在硬盘里做比较麻烦啊。给他转过来啊。
02:02
这三项给它做一个构建啊,然后src。Come,哎,先先粘这两个啊,先粘这两个。然后再咱咱们这个come。我靠,这个卡我要不要重新打一下我看看啊。On my bet is map,行,我先转过来。行先不看它啊,咱们看这个下边的啊。咱们先来这个测一测。好不好使?咱们这个第二个项目,根据ID查单条看看好不好使,先测一下。
03:08
好说。嗯,这个啊,咱们咱咱们要确保这个是第二个项目身上的啊。这个没问题啊,那比如说再来一个A002呢。哎,没问题吧,那鹿晗嘛是吧,行,我们现在啊来做一个这个最基本的这个搭建啊同学们好,既然咱们要做这个MVC这个分层了。我们就得啊,这个包结构啊,就得丰富起来了。上面所有东西干掉啊。想想都有哪些包啊,其实这个倒面肯定得有的,对吧,这是必须的啊,百分百有。Map这个也是必须得有,我把这个注释啊,比较容易我去掉了啊,上面有个备份OK吗。
04:04
啊,然后下边这个TEST1。我重新写吧,重新写啊,这个东西一会儿咱们都所有东西都重来啊。我就留一个模板啊,这个东西我看看啊,这东西留着啊。先留着,然后这个路径一会儿可能需要稍微改一改,看看北京power note map暂时先不用改啊,好,我们现在啊,把这个需要的包结构啊。都给它引进来好六出来一个package好啊,首先是咱们这里来一个工具啊。工具包是必须得有的,我不能每一次都来一个什么circle session,那个工厂吗?这个circle session身工厂很明显它是单立的。整个项目执行的流程,你想一想,三生会话肯定是针对于每一次用户的访问,肯定会话重新给你建一个,这个没问题,对吧。
05:06
对吧,但是工厂咱们是建一个就行了,所以说这个工厂咱们得肯定得给他放到这个工具里边,而且呢,提交事务,每一次我自己手动提交,是不是会很麻烦呢。分层之后,咱们这个事物怎么提交,大家再回忆回忆OK吧,所以说今天这个工具啊,虽然他叫这个U工具吧,但是今天上午咱们写这个工具需要大家回去啊,二话不说,必须得背。你就像给我背英语单词似的,OK吗?给我背下来,脑子里边代码量要积累丰富的,OK吗?今天咱们见这几个U啊,这一定都要背的啊,好,然后扭出来。下班是什么呢?啊,该D了是吧?D,咱们主要做的是这个倒层嘛,好,再来啊,Service啊,ERVSE啊,那最后咱们应该还有个controller对不对,Controller咱们现在没有做一个这个web啊,我们现在就拿这个test啊,主方法当controller的,我有主方法调业务层行吗?好,那我们从这个U开始学起啊,还记不记得我们以前在做JDBC的时候啊,其实老师带你封装了一个什么呢?
06:20
啊,JDBC相关的这个工具类是这样吗?好,今天啊,我们要封装这个工具类,主要是用来操作MY的,OK吧,好,那么如果是这个以前JDBC的啊,习惯于一种叫法叫做什么呢?JDBC。或者直接叫什么呢?DB。YouTube OK吧,好,使用MYBAT框架啊,我们习惯于把这个工具类叫做什么呢?CIRC。因为我们现在这个工具啊,就是用来玩这个的,OK吧,好,我们现在啊来看一看这个circle session u都能干嘛,其实跟我们之前做JDBC的那个工具是非常非常的相似。
07:07
OK吧,好,嗯,以前大家回顾一下,以前我们做那个JDBC的那个u to里边都写了什么,大家现在想一想。加载驱动取得连接。啊,取得连接之后,咱们把这个连接存放到thread local中,还记得吗?做了吧,然后呢,还可以关闭连接,是这样吧,其实也一样,差不多少啊,OK吧,好,那么我们现在来一个。这个最主要的这个功能啊,用来取得咱们这回不是取得链接,这回取得什么呢?Circle session对象是这样吧。好,还有一个什么关吧。
08:00
是不是跟你以前取得connection对象,关闭connection对象是不是一样,只不过以前多关了几个吗?以前关闭得关闭result,关闭ment,最后关闭connection对不对?这回咱们是不是就关闭这一个circle session对象就行了,对吧?好,我们现在来取得circlerc session对象,好,我们来一个public,要来一个什么呢?Static是一定要来的,因为工具嘛。对吧,啊,用去直接掉比较方便,对吧?Circle session,咱们来一个get。Session OK吧,好,这东西搁哪拿呢?哎,难道我要把昨天那个模板一口气的给他粘过来吗?来翻一翻咱们昨天的那个模板啊,同学们。我还是把这个PDF文档先给打开啊。
09:03
嗯,第几页来着,我看看啊。第二页是吧。那第二页就是他们。咱们是不是就是为了创建咱们那个SQ30那个工厂啊。是这样吗?我直接拿它之后拿到这个circle session工厂,通过这个工厂调一个open session还记得吧?取得一个赛事对象。要怎么做吗?那你想一想,你每一次在调这个方法get session的时候,是不是都会重新的通过,又出来一个建造者给你创建一个工厂啊,没必要吧,工厂咱们是不是创建一个就行了?对吧,也就是说你创建这个工厂跟我们之前JDBC那个加载驱动其实是一个道理。我们现在这个工厂的创建时机应该是什么?是不是应该是在我所有的get session操作之前,你先把这个工厂创建出来啊?
10:07
再有一个什么呢?这段代码只执行一次就行了,它优先执行,而且只执行一次,跟你们以前那个驱动放一个地儿什么,哎,Static static静态框是不是两个特色呀,在我们的当前类中,所有的方法执行之前,他优先执行是这样吧,而且这里边儿的代码只执行。一次啊,所以说啊,就是为我们的创建工厂量身打造的,是这样吗?好。来,前面翻掉啊,我先my bet is canl对吧。啊,这里边儿呢,咱们来个check啊。行,我得让下边的方法看到factory啊,同学们。怎么办?他现在在这个静态块里边,我下边是不是看不到啊,分属于两个不同的域对吧,应该给他干嘛。
11:04
拿出去呗。Private这是也是static这如果不是static这里边能访问吗?访问不了啊。哎,难道我这么写就行就行了吗?不行吧,27行,你是不是在静态块里边又生成了一个circle factory,跟它是不是完全是两个呀?把这个声明是干掉就行了,对不对?行啊,我给它折上去好,这回这两个circle factory是不是同一个工厂?对吧,行,接下来咱们来写一个。叫thread local,以前咱们存的是不是这个connection对不对啊,这回咱们要存谁呢?Circle啊。
12:06
Thread local啊好,那大家注意啊,我们现在在这个后边的这个范型里边注意啊。这个东西咱不填行不行,直接不写出也行啊好,然后呢,我加一个这个括号是也行,或者呢,我把这个东西是不是填全也行,对吧?好,但其实啊,大家注意啊,我们在这里边啊,其实不写最方便。很多同学都是不写对不对,好呢,大家注意啊,我们将来这个不写啊,其实不是很好,我们将来用一种比较多的方式什么呢?就这种,这个叫做菱形语法,也就是说,呃,你把这个监括号给它写上,在这里边不写内容,这种形式用的比较多,企业里边用的比较多,OK吧,好,为什么用这种菱形的语法,大家想一想。
13:00
你可以思考一下同学们啊,那老师刚问完没到0.1秒,不知道啊。你,你不思考思考啊,你怎么知道自己不知道,你不知道为荣啊。想一想同学们你看看啊,从我们代码的这个可读性来讲的话,注意看啊。你看看是不是,诶我读到后边的时候,我知道这里边它是一个什么呢?泛型能理解我意思吧,那如果把它去掉,哎,我是不是显得拗一个local,或者拗出来一个其他的这个类是不是显得,诶我把前面的这个泛型是不是在心里边也忘了,OK吧,最起码人家给你做了一个标识,我这是带泛形的,能理解吧,OK吧,好,所以说啊,以后如果你实在懒得写啊,啊,你就直接以这种这叫做菱形语法的形式来写,OK吧,好,或者你把它填全啊,这个都可以啊,老师的这个习惯是什么呢?这个我把它填全,因为我很在乎这个,咱们这个代码这个可读性啊,可读性必须得强,OK吧,好,前后都能看到这个泛型的这个类型啊,好,这个就是个人习惯了啊,不强制要求。好,接下来我们来一个。
14:15
Circle。Session啊。Session来点。Get,但是大家现在思考一个问题,T1定能get着这个so session吗?不一定,对不对。是不是不一定啊。它一定能get得着吗?Thread local,你可以把它想象成一个容器,这个容器你如果不往里边存这个circle。这容器里边是不是啥也没有,它是空的,所以说当你存过之后,我再提点get,我是不是才能取啊。没错吧,好,所以说我们现在啊,这个session啊,不一定有没有,我得判断一下,如果这个session啊它没有。
15:06
我们在干嘛呢,咱们说得创建一个呀。等于什么?这工厂你不能白创建啊,同学们啊,来个点。Open session试一下吧,好,这个session创建完毕使用,不要忘记给它存放到。Local中OK吧,这点需要注意了啊好,最终啊,咱们把这个。啊,最终咱们把这个session给他返回就行了,OK吧,好哎,我问问大家这local。用它的这个作用是什么?也就是说在我们程序执行的流程中,执行执行执行执行到这一步的时候,注意看老师进行到这一步的时候,我需要使用到circle session,对不对,我创建出来一个circle session。
16:08
那我在执行到下一步,执行执行执行到下一步的时候,我是不是又需要一个SQL session,你在调这个方法的时候,它是不是又是一个新的s session?对吧,我再执行执行又是一个新的circle session,对吧?那如果是多个circle session的话,咱们这个事物是不是,哎,没有办法统一操作呀,如果我们想要将所有的与数据库交互的操作给它统一的融入到同一个事物当中,我所有的业务的操作是不是都得统一使用一个session?是这样吗?所以说我变成了这样,程序执行执行执行,诶我到这个时间点用到这个session了。诶,首先啊,用到这个搜赛,我是不是首先我得想着去哪拿呢,Local中去拿对不对,虽然local中有没。
17:06
我可没存过呢,没有吧,没有怎么办?创建一个,然后塞进去OK吧,下边我再走走走,再走到其他类里边又用到这个circle session了,怎么办?到circle到什么库中去拿OK吧,拿到之后是不是就是上面创建的那个。哎,也就是说当我第一次在使用的时候,其实是一个创建并存放的过程,我第二步到第N步其实就是从外log中取的过程,所有的流程保证的是同一个Q对象,我们这个事物才能够生效,OK吗?好,所以我们用到这个local啊。呃,最后一个咱们关闭一个这个circles对象啊,来一个public。Static啊,这我直接来啊,啊跟我们以前这个close区分开啊,Close close,我写一下自己的啊,这个circle session。
18:10
如果咱们这个啊。他不懂。哦,来干什么?session.close对吧?最后不要忘记来个什么T点。Mole。是这样吗?这句是不是必须得加的?这句必须下,非常容易啊。这句是干嘛用的?哎,是不是将什么w local中保存那个circleq session给它剥离开来啊,啊,强制给它清空一下对不对?诶,那大家现在思考这么一个问题,我为什么要非得要给它剥离开来,也就是说当我这个线程啊执行完毕之后啊。
19:08
我这个县城不就销毁了吗?那我当前线程首先外你得知道啊,是基于当前线程安全的存取机制,是这样吗?只要当前线程还在。是不是RI local里边保存的这个circle session就在啊,如果当前线程没了,是不是相当于什么里边保存的这个local啊,Local中保存circle session也没了,对吧?好,那大家现在思考这么一个问题,我这个线程都执行完了,也就我都三身,我都可close了。说明是不是我访问数据库都访问完了,哎,当前线程执行完了,那一个请求对应一个响应完事了,线程没了,我为什么还非得要手动的来个t remove。
20:04
那是因为大家注意啊,其实咱们这个现场没有真的销毁掉。OK吧,其实我们会涉及到一个什么样的概念呢?叫做池的概念,昨天是不是说到一个连接池的概念啊,这回再给大家带来一个什么线程池的概念,线程池和连接池其实是一样的。OK吧,好,注意听老师描述啊,我们现在从浏览器注意听为服务器发出一个请求。服务器分配一根线程来干嘛呢?处理浏览器发出的请求,请注意老师的这个用词啊,我说的是什么啊,分配,我可没说服务器创建一根线程来处理的请求,我只是分配,我说分配就证明什么,这个线程已经有了Tom cat服务器自带线程池,OK吧,这点不需要我们去操心,OK吧,好,其实他分配的这个线程用完之后它没销毁,它回到哪去了?
21:08
线程池种了OK吧,所以说啊,当我们的每一次操作结束之后啊,线程回到线程池中,连接呢,回到连接池中是这样吗?谁也没销毁,所以说需要我们手动的将这二者给他强制的剥离开,剥离开之后,是不是相当于我这根线程又是纯净的了,我下一个人再使用,再从线程池中捞出来这根线程,它才是纯净的。OK吗?好这一句啊,必须得加啊,这这句太容易忘了,否则以后你在做这个啊,呃,周三改操作的时候,会出现莫名其妙的这个问题,什么叫莫名其妙呢?也就是说将来我们在这个查询数据的时候,你明明查询的是咱们第二页的数据,我就给你显示第三页儿数据。
22:02
就是因为什么呢?就是因为我们这个circle的这个状态它已经乱了,OK吧啊,它会记录你以前的这些个状态,OK吧,所以说每一次在你使用完咱们的这个什么呢?这个连接之啊,Session之后啊,也就是说需要我们手动的啊,把我们的这个连接和这个线程给它剥离开,让它们变得都是纯净的,OK吧,好,这点啊一定要注意了,好吧,这个工具类啊,没别的啊,这属于基本功的这个范畴。啊,它跟这个比如说你取一个日期啊,取个UUID啊还不一样啊,OK吧,就这些基本功的范畴是必须得背的,OK吧,没有为什么啊,就是背行了休息会。
我来说两句