00:00
好。刚才我们这个第三步,我们看到了咱们这个open session get member以后呢,就会拿到接口的这个代理对象来总结一下这一块的流程呢,也就是说来当我们调用get member方法的时候,来它会使用咱们这个member pro factory,哎,这个factory呢,在我们初始化的时候都已经,哎一个接口绑定一个这个factory都已经保存好了,使用它创建一个member proxy的代理对象。啊,这个代理对象里边呢,代理对象里边包含了。那我们叫default是不是sation,哎,包含了这个对象啊,而我们都知道这个default sation里边呢,要能执行增删改查,又包含了ex,所以说呢,一层一层的包含,那么这个代理对象能执行增删改查,最终肯定就会,哎,用s session里边的or?好,那我们就来探究一下它对这个查询怎么执行,给这打一个断点,好,放在这,我们来给bug运行。
01:16
走。之前的流程呢,我们就放过好放过哎,它这构建解析setting元素,解析map标签,哎,以及咱们这个,呃,解析每一个member标签成statement,包括我们这个open session,我们也直接放过,拿到我们这个default circle session,然后呢,从default circle session中在get member拿到代理对象,好接下来我们调用代理对象的get em8id方法好step into进入好一进入以后,那么第一步,哎,咱们就会执行in work,因为我们member proy,它是一个引卧开handle了,执行目目标真正方法之前会执行引卧开handler的work,我们把这个图也画出来。
02:05
创建一个时序图,好这一块呢,我们就来说马贝第四咱们这个执行流程work。In work的流程。执行增删改查的流程,我们来画出来。好在这里边我们来说,首先呢,我们会用map proxy,哎,我们知道它呢是一个,哎in,我开handle,他呢去调用引沃克方法。调用in work方法,我们执行增删改查,会调用引work进来呢,它会判断当前方法,当前我们要执行的方法来,就是这个里边的get employee8id,当前方法呢,是不是object类声明的,它声明的类如果是object,也就说我们之前也说过,如果你这个muscle的,哎,我们虽然是代理对象,那代理对象里边呢,有些方法是接口里边啊规定的,有些方法呢,又是我们来自于object类的,比如to string,哎,比如has code的这些方法,如果呢,直接是object类的方法,不是接口的,那么呢,我们就直接执行啊,而我们现在呢,当前要执行的方法就是get employee8id是我们接口规定的方法,然后再过来执行,执行之前它会把当前方法method,哎,当前的method包装成一个map method,哎,这个map method呢,就是我们马贝斯他能认识的,它调用map method。
03:33
所得的执行方法好,所以说呢,我们这个图画在这。会有一个mapman的。Me?也就说呢,我们这个member,哎,它调用work,哎看来work的时候。哎,在这他引work的时候呢,调用的是。In work。
04:00
哎,你work的时候呢,哎,它呢会调用咱们这个member method,而member method呢,会调用它的方法,调用的时候呢,传入circlerc session,诶CIRC session呢,我们member proxy里边我们都包含了,我们知道代理对象里边有它传入circlerc session,再传入调用方法要用的参数,哎,我们有一个参数,我们获取一号员工好,我们进来step,我们来看member,呃,Method的咱们这个involve excu方法,它会先过来判断判断command,哎,我们这个circle的这个类型是添加修改还是删除,而这些类型呢,啊,我们之前,哎在这个方法里面呢,我们解析到了每一个标签,每个标签里边它的SQL语句的类型我们肯定都会有,所以说呢,他在这里边拿到我们当前的SQ类型,而我们是一个查询,那么就进入查询方法,诶这一块呢,先判断。
05:02
哎,他这一块先会判断。看到。咱们这个增删改查类型,就说呢,你是增删改,你是增加删除还是修改,然后呢,我们现在是查询,查询就来到查询方法,哎,你看啊,如果你当前方法是返回空的,哎然后呢,就怎么去执行,如果是返回多个的怎么执行,返回map的怎么执行,返回我们这个cor游标的怎么执行,哎一而我们呢,就是一个正常返回老一对象,哎这些都不是,我们就会进入这个else流程,Else流程的第一步,哎第一步就是调用map method,哎,Convert to circle command,这一块呢,我们之前在参数解析的时候也进去过,我们不妨可以再进去一遍,就是当前方法,它先把我们传进来的一号参数转换成我们能用的参数点进去,在这块参数呢,用参数解析器来进行转换,点进去来,它呢,就是我们之前看过的流程。
06:07
如果参数是单个直接给你返回,如果参数是多个包装成一个map,然后把map给你返回,所以说呢,这块的流程我们就,哎不不再细看了,好我们现在就是一个英退,所以说呢,它直接返回这个好我们这一步。判断类型,然后呢包装啊,它在这一块包装。包装参数。喂。一个map或者直接返回来,你这个参数呢,我要么包装一个map,或者直接给你返回,好我们现在呢,直接返回,接下来调用circsion的select one,诶我们查询单个查询查询多个会调用TE for,而我们查询单个就是select one,好,我们接下来调用circle。
07:01
One。好,我们还会有一个叫circle,而这个circle呢,我们也都知道,就是我们的ul circle。Session是我们这个对象来调用default circle的啊,咱们这个哎,查询单个。好。然后呢,他去调用咱们这个萨莱特。好,调用咱们这个CI的select circle。第头。好,调用这个查询单个方法,我们就来看这个查询单个,哎,怎么来查command的里边呢?哎,Circle command啊,包含了我们这个circle语句的,哎这些信息好,我们来。进去。走返回走再进去,我们来看查询单个,我们来看啊,即使是查询单个,最终调用的都是default CI里边的select list,哎,如果是单个,我就给你拿到第一个值,所以说呢,它最终还是调用select list。
08:12
哎,它是调用他自己的查询多个。List它是来调用这个查询多个好,我们来看啊,把这个select list后的值,然后呢返回给我们。哎,这个值。这一块的值最终相当于给我们这个返回。返回咱们这个查询。返回list的第一个。就是我们查询到的单个了。那么关键就是这个select list,它到底是怎么查询的,我们就进来好,传入statement,就是我们当前circle语句的这个唯一标识好,以及我们要用的参数step进来好,调用default circle的select list好进去。
09:05
好,然后呢,他从configuration从全局配置中拿到我们这个ID,哎,我们都知道我们全局配置中有ID对应的,呃,每一个增删改查标签的详细信息,我们来看就在这个全球配置里边呢,有一个叫map statement,每一个方法的ID对应它的封装了。咱们这个增删改查详细信息的map statement对象,所以说他第一步先拿到这个map statement对象,然后再传进来。好在这一块。他在这儿呢,还是相当于先获取。获取获取咱们这个map。的statement map的statement呢,我们都知道它封装了标签的详细信息,他在这里边呢,拿到map的statement,然后调用excu,哎,传给excu的扩RY方法,所以说呢,我们最终在这还会来到。
10:11
来他拿到这个呢以后呢,传给这个excuor,调用excuor的增删调查好这一块我们来看啊,这一块呢,我们调用的是excu的这个查询好,我们就来进来看它查询,查询呢第一步先把我们这个参数,我们传过来的参数一又要包装,而这个包装呢,我们大概来看一下,就是我们之前说的,如果你传一个list特啊,或者呢,咱们这个数组集合类型的,你要取值,你的井号大括号能取出这些list子来,这是它的K,在这一块呢,就有这个逻辑,看判断你这个当前对象,如果是一个集合,给map中保存一个K叫collection值,就是你这个集合,如果这个还是一个list,给map中再保存一个list值,就是它,哎,最终呢,把这个map返回,如果你是一个数组,哎,保存一个K叫瑞,把值保存进去,也就说呢,它判断。
11:12
那你当前的这个啊,参数如果是一个集合呢,这就是包装集合的过程,把集合呢放在map中,好,这一块呢,我们看过往下走,就调用它的query方法,我们来看,首先query方法第一步它会从map statement get的circle,哎。我们叫获取绑定的。这个棒的circle是一个什么呢?我们点进去看一下这个类。这类里边呢,我们来看啊,哎,有一个string circle那呢,应该是我们circle语句,以及呢,包含啊咱们这个circle要用的啊,参数的per perter map,参数映射,以及咱们参数的值,哎,以及一些其他信息等等,哎,有非常多,所以说呢,我们来看它第一步就获取到这个棒的circle对象,好我们给他返回,好他拿到这个棒的circle,这个棒的circle其实就代表我们这个circle的详细信息,包括circle语句是什么,包括circleq要用的参数是什么,包括这个参数啊啊,我们这个circleq语句里边,我们这个问号占位符取值的时候呢,拿ID取它的这个类型,以及各种信息,我们要取值的这些参数信息,你看啊,能定制的东西也都在这儿,所以说呢,这些信息都封装在这儿,有一个棒的circle口,它呢代表我们这个当前的这个circle口详细信息。
12:38
获取。哎,这个第七步,哎,它获取map statement map statement拿到以后呢,它调用,哎,它调用咱们这个get circle获取到。诶,这一块我们没画上啊,没画上啊,我们来看啊,就是说呢,拿到map statement调用的query。
13:02
这一块没画上的。的quary方法啊,第二的quary quary呢,会传入我们map的statement以及其他信息,好,那么接下来我们就来看这个query的时候呢啊,我们刚才进的是这个quary quary第一步先获取到啊,咱们这个SQ语句的详细信息。哎,获取咱们这个棒的circle。啊,他代表。Circle语句的详细信息,好代表circle语句的详细信息,那么呢,我们把这个棒的circle拿到的这个棒的circle我们也截个图发给大来,给大家保留出来。来观察好,这里边呢,哎,有非常多的信息,包括我们要用的SQL语句,包括我们要用的参数,以及参数在SQL语句里边的映射关系,好。
14:05
拿到它放在这个图,好,这就是我们这个又一个比较重要的棒circle对象,好,接下来呢,拿到一个catch k,哎,创建一个缓存,哎,这一块呢,因为我们有咱们这个二级缓存,我们用的是catch,所以说呢,它会创建出一个缓存,而如果我们没有这个。这一块当然都不会有,而这个缓存用的K大家可以看一下啊,这个K特别长。这个缓存要用的K呢非常长,哎长的呢,哎,我们来看可看一下它这一块呢,有一个咱们当前的这个哈西扣的,以及咱们这个它的这个呃,检查码,以及咱们这个方法名传入的咱们这个以及咱们这个啊,我们这个参数的这个哈西扣的,以及咱们这个SQ语句,以及咱们传入的参参数值,以及咱们这个开发环境,所以说这个K啊特别长。哎,这个K呢,我们只是感兴趣啊,给大家截一下,并不是让大家要掌握的。
15:05
好,这就是咱们这个二级缓存中保存的这个K。啊,一级缓存也是这么用的,缓存中保存的咱们这个K,哎,这个K呢,就是基于咱们这个方法,方法名加上,哎,咱们这个,哎应该是基于方法ID,加上咱们这个SQL语句,哎,加上咱们这个参数信息等等等等一大堆,哎。好,然后我们再来看它,再调用query方法进行查询,好走,然后呢,如果有二级缓存,因为我们是C,它就拿到这个缓存,而拿到这个缓存呢,我们没配什么缓存,哎,所以说呢,它是从map statement,那么当前增删改查标签里边拿到缓存,如果我们啊,这个插麦文件中有配缓存这一块就会有,现在呢,我们没有直接放过,接下来它调用堪称excuor,我们知道堪称excuor是对excuor的包装,所以它最终还是调用excu,就是我们simple s的增删改查方法。
16:15
好,所以说呢,这一块,哎,这是咱们这个。它呢,最终会调用我们,真正的我们叫simple。哎,是simple或者呢reuse或者是什么,哎,你全局配置写的是什么就是什么,然后呢,调用它进行查询的。好。这是他调用咱们这个进行查询,哎,调用我们这个ex。An execu。SQ。看到咱们这个括RY方法,那么这个括RY方法呢,在这一块我们就得非常注意,好,我们进入这个括走。
17:03
查询,我们来看他怎么查。好,他在这一块呢,查询他先整一堆资源好拿一些东西,好这一块呢,还有清什么本地缓存,好我们接下来看啊。它在这里边,它先从本地缓存中拿到,按照这个K,我们刚前的K拿到这个查过来的值,但是呢,我们第一次查,所以说缓存中没值,这也就正印证了我们说的先查二级缓存,因为二级缓存是我们,我们来看方法调用站啊,这是我们当前的query,先会调用can query,而catch呢,就会直接在这拿二级缓存,从二级缓存中拿,而我们呢,没有二级缓存,所以说呢,调用我们自己的ex,又从一级缓存中拿好,拿到以后呢,但是我们缓存中没有,没有整段放过好,如果没有list是空,它就来调用corry from that source,所以说这个查询大家也注意。
18:05
Simple inco。好。会会看本地缓存。哎,查看。查看本地缓存是否有数据,哎,没有就调用我们这个真正的查询方法叫query from database。就是调这个方法,那么呢,我们就来看一下这个方法它是怎么写的。好,400步音图这个方法里边呢,它调用之前先给本地缓存啊啊local catch,哎本地缓存呢,是一个purpose catch,给本地缓存呢,先放一个KK呢,就是咱们这个值,然后呢放一个值,这个值就是一个占位符,好放在这,然后查出数据以后大家来看啊,把这个数据呢,List又放在这个本地缓存中了,所以说呢,大家应该知道查出数据以后会给本地缓存中。
19:06
好,查出以后呢,我们又保存在本地缓存中,我们把这个呢,就全部写在这一句话上查出的。查出以后,查出以后也会保存在本地缓存中,哎,这就是我们讲的一级缓存原理,在源码中也是这么体现的。好,我们接下来继续看,然后呢,我们来这一块呢,我们就来看它这个查询怎么做的,它调用do query,然后呢,它是调用best,有一个best。哎,反正不管是什么,他就是。要用best呢?Query方法,Do query方法。调用它的这个do query,这个do query里边呢,传入了一些信息,大家看一下,这信息呢,我们都知道,哎,每一个我们都见过map statement当前增删改查标签的详细信息,Prime啊,我们这个要用的这个参数,包括这一块还传了一个result set handle,而我们呢,现在还没有,哎,什么东西棒circle呢,我们也知道代表了circle语句的详细信息,而这个rule棒子,这是my circle在做逻辑分页的,我们不用管,这个逻辑分页呢,不太好用。好,我们来进去看这个query,好,Quary的第一步,我们来看query方法的第一步,首先呢,声明一个statement对象,这个statement就是我们原生JDBC的statement,所以说我们买贝底层也是用的原生的这个JDPC,好先整一个statement。
20:53
但是这个statement赋值我们得看,哎,在这才给它赋值了,赋值前呢,先拿到我们当前的配置信息,从map statement里边来拿到我们当前配置信息,然后呢,这一块它会又一个statement handler,诶会出来一个statement handler对象好。
21:15
这个呢,四大对象之一叫STEM handle了,就是把这个拗出来的handle了,传进这个方法里边,才创建出了STEM的对象,所以说我们接下来这个就非常重要了。哎,四大对象之STEM的handle是怎么创建的?好,我们来看一下啊。好,它会呢,创建一个handle,而这个handler的作用,哎。可以可以他们了。可以创建出。创建出咱们这statement对象。
22:05
哎,所以说人家叫statement,看到了吗?Statement的处理器,而至于这个真正的呃用法,我们下来再看好这个呢,也就说它调用杜括瑞,杜括瑞的第一步,哎,就是先创建啊一个statement handle对象,哎,这又是四大对象。要创建了。创建。创建data。看到了对象。而这个创建呢,我们来看一下它怎么创建好,拿到全局配置信息,调用new休息进行创建,来进去好,它在这里边呢,拗了一个,哎,Routine他们的看到了,这个routine呢,我们来进去来看好叫了哎,我们来把这一块呢,异常的一点一点慢慢返回,我们来看这个new RO怎么拗的。
23:05
走走好,走进去,进去呢,以后来看,我们来看statement handle了,他会先判断,哎,Get statement type,哎,这是从map普statement这里边拿到的,而这个我们都知道,它是代表当前增删改查标签详细信息的,拿到它的statement type,而这个statement type呢,其实我们说就是在这里边能进行设置,哎,我们查询标签里边。哎,在这个里边呢,会有一个叫statement type,它会有多种取值,哎,如果是statement,就使用非预编译的方式,哎,就用我们原生的,如果是prepare,就用我们原生的prepare statement,如果是就使用able statement,它就能调用,哎,咱们这个存储过程,所以说呢,在这一块能进行变化,而我们没变过,没变过默认就是这个statement。
24:09
好,默认是他,我们还是来到这儿。好,拿到我们这个类型我们没变过,那我们哎没变过呢,默认哦是这个prepare的,这个的话呢,我们在官方文档里边也能看到,比如我们这个查面标签,我们这个查询标签,查询标签呢,每一个属性我们来往下看。就会呢,有一个statement type,哎,我们来看啊,默认就是prepare的,哎,使用预编译的方式,好,我们来看啊,我们是prepare的,所以说呢,就会new一个prepared statement handler,所以说呢,我们最终相当于创建出了一个。创建出了一个叫prepare statement,看到了对象,哎,也就说呢,哎,我们这个prepare statement看到了。哎,会创建出一个他。
25:02
它的创建过程呢啊,大家也可以进去过去只不过就是一个按照构造器创建一个这个handle而已啊。就是按照构造器创建这个handler而已,那没有什么可看的,好让他们创建完会创建出一个prepare的statement,好把这个statement对象创建出来以后,好,接下来呢,我们来看啊,这个statement handler statement handler是一个接口,我们创建出来是prepared statement对象,而我们创建出来的prepare statement还是会有这一步。这一步非常熟悉。熟悉在哪,我们是不是创建也会有一个intercept哎拦截,所以说呢,我们这一块呢。创建出的这个statement。他最终呢,还是一样。
26:03
哎,会进行这一步,哎这一步呢,就是我们拦截器。啊,使用拦截器,我们来包装了咱们这个东西。好,这一块呢,我们这个熟悉的流程放在这儿教给大家,好,我们在这里边。走,让它返回,返回的这个statement handle,最终哎,这是一个prepared statement,如果有拦截器,我们后来再看返回是什么好,这一块呢,会有一个prepare statement创建好四大对象这个statement的创建,它会创建出一个prepare statement,然后调用prepare statement方法创建出咱们原生的这个statement对象,你可以点进去看它的这个创建,这个创建呢也非常简单,来,就是拿到一条链接,然后呢,调用咱们这个statement prepare statement handler进行参数预编译,来设置到我们这个statement对象中,好。
27:05
走,然后呢,调用handle parameter rise,哎,它呢就是参数预变译,我们进去来看,诶你看啊,就是调用参数预编译,而这个预变译呢,就是调用我们这个方法,这个方法呢,大家来看,在预变译的时候点进去,它会调用peretter handle德进行参数与变译,好所以说呢,这一步。第14步它会先创啊,先预编译circle,预编译咱们这个S,产生产生咱们这个prepare。的。对象这呢,就是我们原生接DBC的。然后呢,哎,接下来他又会调用。调用我们handle。
28:01
调用来使预编译参数调用来。Ter handle来,这又是四大对象,Handle编译参数。设置参数,设置咱们这个参数好,所以说呢,我们来看啊,这个handler啊,在在这个是使用的时候呢,人家都已经有好对象,有对象是在哪有的呢?就是在我们创建这个statement handler的时候,构造器里边哎,都会帮你来创建两个东西,哎。在这一块呢,我们来补充一下,在创建我们statement handle对象的时候,也会接下来创建两个东西。好,创建咱们这个创建parameter handler对象。
29:00
哎,大家看啊,比如说呢,在我们这个。Base啊,我们这个statement hand到了构造器里边,它会呢,创建出per hand到了,而创建的方法扭进去,大家来看也是熟悉的一步,哎,Intercept。我们把这个拿过来啊,这一步大家一定要注意。我们不断的来强调这一步流程好创建,接下来呢,还是一样创建。ER handle创建完了以后呢,我们还有一个。再来看。好转handleler,我们来到咱们这个呢构造器,这个构造器呢,还会创建result set handle了,哎,就是我们这个handle这个创建过程呢,也一样点进去你看啊,还是这一步。所有的拦截器把它跟O。创建在这一块呢,我们这个四大对象就创建完了之前就创建完了,创建statement handler的时候呢,把其他两个也都创建出来,好这块都创建出来以后。
30:09
我们再来看。这个返回list的第一个。这个已经是后边的事。好18步了啊,我们刚才把顺序写的有点返返回,嗯。第一个。好,接下来我们来再来看这四大对象,都整完以后,我们再来做做。好,就是这个它既使用它para handler调用set parameters进行参数与编译,而这个set parameters呢,大家就可以来看这parame handle用的是它,哎,它里边呢,要调用set parameters。哎,这个set parameters呢,在里边设置的时候,哎这一块呢,我们都不往下看,哎我们直接来看一步,它呢会拿到一个叫type handler,哎,我们type handler也听过叫类型处理器,然后调用类型处理器的seter,然后把我们prepare settlement PS这个呢就是我们传过来的prepare statement给我们prepare statement里边设置值,好设置参数,这个设置参数呢,我们大家需要知道它是调用。
31:26
调用太不当了。调用咱们这个help,看到了给咱们这个circle语句。预编译参数,预编译设置三参数,好,接下来呢,我们接继续来看它参数,设置完预编译参数我们让他走,哎,让他设置完。好让他设置完以后呢,我们接下来调用query方法,哎,调用我们真正handle了,我们这个prepare handle的quary方法查询。
32:02
哎,查询我们给放过了,这次一查以后呢,整个数据就查出来了,而查出数据呢,我们来看啊,也一样,查完以后呢,他又用result set看到了,来封装来处理我们查出的这个结果。好,所以说呢,这一块查出数据以后。At。查出数据。查出数据,使用result set。到了咱们这个处理结果。哎,因为这一块的流程呢,我们来看这个query,哎,Qua瑞他一执行完以后,把执行完后的这个prepare statement传进来,然后在这一块处理结果,包括这个处理结果的时候,我们也可以往下翻,在处理结果,哎拿值的时候,哎这获取值大家也可以感兴趣点进去,它在这一块拿值也是使用,哎把类型呢转换过来,也是使用咱们这个太宽的来转换的,我们也可以来看一下。
33:12
我们可以进入这个方法,进入这个扩位方法,好,我们大概的来看一下它这个参数的值,获取处理参数。好,在这一块进行处理,在这块处理呢,我们来看它,哎,使用type handle了,来进行取值,这个取值呢,啊,我们就不往这走流程了,我直接给大家来说,这里边呢,有一个处理,哎,我们来看啊,Get property啊,获取property映射,哎就说呢,把我们扎B里边每一个属性在S语句,哎在我们结果里边对应的值拿过来,你看就是使用type handle了,哎,Get result获取出来值的,所以说呢,我们这一块查出数据,使用它处理结果也是一样,哎,使用咱们这个type handle了。
34:00
看到了,取出把咱们这个。获取咱们这个获取咱们这个Y流值,好比就说呢,咱们这一块整个处理完以后,咱们这个结果就返回了,哎,我们这个查询就做完了,做完以后呢,就返回给我们。哎,给我们就返回,返回了以后呢,我们把查出的数据返回。后续流程,后续后续的咱们这个关连接啊做啥了,后续咱们这个连接关闭等流程让他来做,我们就不不再来看了,就会返回这么一个list,好,这就是咱们这个,哎,执行流程图,这个流程图特别复杂,我们得总。
我来说两句