00:00
我希望大家最终掌握的是什么呢?最终掌握的是其内部蕴含的原理,他是怎么干的,然后我们能把这种思维方式掌握了,回头可能还会接触到啊类似的东西,或者说跟他稍有不同的,我们能够通起来,叫主类旁通,叫融会贯通,这个通特别重要。OK,我们认真的来看一下这个查询的方法,Public,我们说叫query查询。爱他。这哎,我们也需要先创建一个run。等于new,当然因为这个的话呢,是线程安全的是吧,所以说你可以把这个拿到去顶上来,然后的话呢,把这个去掉,这是可以的。
01:08
然后这里边当然我们也需要有connection,等于好了,我们进行一个查询,查谁呢?比方说哎,我就希望把这个所有的这个信息全查出来,然后在我的控制台里边打印出来,看怎么干啊,我们来做一个查询,我想得到的是一个customer对应的一个list,所以说我先需要新建一个customer。我们新建卡这个过程实际上就是在做一个叫or映射,Or就是对象看private类型的ID private类型的name类型的email被字型的。
02:07
赛方法。为了创建对象方便呢,我们写一个代餐的步照器,那一定要写一个午餐的,因为它可能需要被反射的方式去碰见,就测试的话写一个。的F,好,写完写完之后呢,我们希望返回的是什么呢?我们希望返回的是一个list,这个list这个事儿吧,我们再说,我们现在进行测试来代指。Bc release。那这没问题好了,异常一定要往外打一下,不要不打的话,你这块你直接这写完之后,可能会是个什么情况,出异常我们都不知道有什么错是吧?所以说有异常我们起码要打印一下,然后connection等于JD bc tool.get好了,下边我们要来做一个查询,看一看到底是怎么查的,查询二专呢?
03:31
哪诶,我们看到它有一系列的重载方法,现在的话呢,首先我需要确定传了一个connection,当然我需要准备一个circle啊。准备一个circle string的circle等于select ad。Email。From customer。
04:04
好写完,然后的话呢,我们来进行一个宽RY,这个时候因为我没有这个可变参数,我们看可用的当这个档上斜线的是不是过时的呀,不建议用第一个,第一个没有connection,第二个可以用,呃,这个没有connection,最后一个可以用,这这个跟我们这个第二个有什么区别,是不是就带了一个可变参数啊,这个可变参数应该是添4Q站位符的吧,我们这里边没有站位符,所以说用第二个就可以了,好了,Connection是有的,Circle是有的,问题是后边还有一个result set handler,它叫什么呢?它叫。结果及处理器,好了,这个结果级处理器呢,我们暂时写成一个内的形式啊,结果及处理器我们来看一下文档。
05:03
好,结果及处理器在这个里边是一个接口,Result set handler啊,结果及处理器里边只有一个方法叫handle,里边的这个参数叫set啊,叫处理结果集,它会返回一个值。我们直接。在play内部创建一个也result set handler的一个实现类,看咋写呢,这么写啊,Set handle。大S handle等于。嗯。我说创建它的一个实现类,我要这么写的话,有点像什么呀,叫匿名内部类,这个应该放到我的这个方法里边来写,我这样来写。到。Us my result said。
06:07
Without。在韩德,好吧,这个发型呢,我实际上处理的是谁呀?处理的是换眼镜,不加吗?处理的是卡,先不加,后来好,我需要额外加上一个方法,方法叫什么呢?叫handle,里边放的是一个without that without好了有个返回值,那我展示,为了测试的话,我不写任何返回值,先写一句话,写一个handle,然后的话呢,我返回一个字符串,艾。写完了,那这块让我传什么呀?他这块让我传的就是一个result handle的一个对象吗?于是我直接来传,他选说LC,大家看啊第啊。
07:07
来好了,然后呢,会有一个返回值,这个返回值比方说是一个object。等于它,然后我们来打一下这个范围值。O,看一下这个返回值是几啊?十几啊。是不是这个艾特硅谷啊,同时我们看见什么这个handle也被打印了吧,所以说在整个调用这个方法的过程中啊,这个handle方法被调用,然后的话呢,Handle方法的这个返回值。
08:00
作为了我们宽宽RY的这个返回值吧,这是特别重要的一条线索,再说一遍啊,说handle方法这个返回值I的硅谷,我们发现它作为了query方法的这个返回值,那于是呢,我们就想,诶,他是怎么做的呢?它并没有像我们想的这样,比方说我们查完了这些这个I ID name email之后的话呢,给我返回很多条记录,而这给我返回了一个字符串,于是我们看一下它是如何进行做到的,怎么怎么办呢?34行,我来点这个方法进来,好吧,关联的是。Comments里边有一个DB u to s RC,打开OK好了,再回来看谁呢?看括方法,大家看啊,括号方法的话呢,它掉了当前重载的这个括号方法再点一下啊,点过来我们对这个方法研究一下。
09:13
Eagle传的是connection circle result handler,还有一个什么呀,是不是还有一个可变参数啊,啊,可变参数我们没传,然后他首先connection是传进来的啊,他先得到了prepare statement,我点一下你看没有什么,直接就是看statement找它啊,这步之后的话呢,然后是填充占位符,你看那个意思就知道哈,点一下我们也看到它的确是在填充站位符,我们以前写我们那个dau的时候,这个代码我们是见过的,带回来那图之后得了一个什么,是不是得了一个结果集啊,有没有得到,你看这一步是进行查询吧,这个是个结果集外方法,是不是直接返回来啊,这是一个结果集,所以说前边这几步的目的就是为了得那个结果集吧。好了,然后这一步是。
10:14
干什么了,是不是掉了这个result set handle,这个handle方法,然后把前面的这个结果就传进来了,然后这个是result,这会的话呢,把这个结果返回好了,这个方法呢,我们给他,嗯,在这个PPT里边来写一下。看一下这个过程啊,首先呢,我们这个类叫宽这个类,这类里面有个方法。好,我们直接来说它的这个具体实现是什么样的。这里边儿的话呢,我目前我有这样的几个参数,第一个。第二个这口第三个handle后尾最后边那个可变参数我不写了,我们看看这个步骤,这个步骤的话呢,这几步。
11:14
C、拿过来。嗯。你看什么意思,这几步实际上前三步我们刚才已经。看到了前三步的目标是为了什么呀,这不就是为了得那个结果集呀,第三步的目标就是为了得那个结果集起来。好了,那这些步的步骤就是为了去得那个结果及颜色,至于底层是吧?
12:04
好了,哎,这些步的步骤只有一个,就是为了我们有什么,有connection,有circle,我能得到一个接口集吧,这个代码的话呢,我们写已经写过好多遍了,而且的话呢,我们读源码的发现也不难读,这个目标就是为了得到。得到结果。一个目标。好吧。好,这个结果及对象的话呢,我们拿到之后,然后怎么办呢,然后它调用了。这这一步呢,这不应该是调用了result set handle的handle方法,并且把前三步得那个结果的对象传进去吧,调用啊传入的result。
13:09
Set handle对象的handle方法,并且把前面和result set对象作为参数传入,OK,这是我们这一步的这个。任务。双击行吧,这样吧,好,这是我们这部的任务,那后边的话呢,还有呢,后边有个什么呀,往这看,后边有一个,我是不是直接把这个作业结构返回来,有一个return results,我来写一个啊。这作用是什么?这部就是把作为结果返回。
14:14
把result作为结果返回,哎,这就是我分析的这个整个的流程和步骤,好,那我其中的话呢,我们说这个大的这个第二步啊,是直接把我处理这个结果集传到这个handler这个什么里边。这个handle能方法里边并执行,我们现在这个情况的话,看这个里边我是不是干脆我就根本就没用它呀,我直接返回一个字符串吧,我本来应该是用它的,这不什么handle result set,我没用它,我直接把这个返回了,于是我这块这个返回值就是。爱的硅谷好了,这个代码的话呢,我们看一下,我直接在嗯,20行这块,20行这块停一下,然后在这个里边的话呢,在四四百零九行这块我也停一下,这个一会打啊好,你看一下效果。
15:19
我跑一下。第八。好,我们看这个时候的话呢,20号这块停了,我们看这个方法的调用站,我首先的话呢,我调的是这个case的方法,这个我们是知道的,然后的话呢,我调了谁呢?我调了括re的括的方法,在这呢,这重这是我们直接过来那个哈,然后我调了重载的括号方法进来。好了,大家看这这块的话呢,就是我们调了这个RSH的handle透方法,我们看看这个R是谁,RSH方大家看是不是我dbu two里边我定义了一个叫什么内部类啊,就my result set handle吧,那这个时候它怎么样,它是不是将去调用my result,呃,My result set handle的什么啊?My result set handle的什么方法呀?Handle动方法吧,那这handle动方法是谁呀?是不是就是我这块教的这方法。
16:18
所以说我下一步的时候它会干什么,他会打一个handle吧,然后的话呢,他会把这个作为结果返回,于是的话,我们再来看一下它,那这个时候我打我打一个观点好了,这个时候我们过来过来你看这个result的这个值是几啊。就就是艾硅谷啊,清楚吧,这艾硅谷是怎么来的,是不是我调这个方法的返回值是艾硅谷啊,于是这里边有一个返回值在哪儿呢。在这儿就是这三位。好了,那这个返回值一跑就跑,跑到我们最上边了,那整个的话呢,这个流程就OK了,这就是我们的执行流程,这我们一个这个是啊搬砖呢。
17:19
真的啊。二方法的返回值取决于其。在handle参数的。Handle方法对吧,返回值哎是这样的这样的,那我们这个图呢,没画完,这图要是接着画的话,应该是啥样了,应该这个时候我们看这个时候我掉了一个叫啊RSRSH的handle度方法,我目前传入的是谁啊,我目前传入的,大家看我目前传入的是不是呃。
18:07
嗯。My result set handler,这是我目前传入的,这是我调的方法,CTRLC,我们看一下我调的这个方法是怎么走的。放这儿。这好了,这是我调的方法,你看当我调这个方法的时候,我传到connect跟circle不说了,那最终在我这个里面形成调用的是谁,应该是这个叫。My result set handler,这个传入,这个传入这个传给谁呀?应该是传给了。
19:00
这应该是传给了这个参数。应该是朋友了,他。哎,传给了这个什么呢?给了这个。啊哎,扔给他了啊,这样一传的话,那意味着什么呢?这意味着我这块实际上进行。实际上进行调用的是谁,实际上调用的是RSH的这个handle,这个RSH就应该是我这个my result my result set handler吧,于是它实际上调用的就是这个方法,这就是我刚才已经写的它。过来看。来,有点大哈,稍等。好了,那既然是它的话呢,那我这块实际上掉的这个方法在这儿呢。
20:14
这个方法指向的不就是这个区域。哎。他俩是养。哎,实际上它有这样一个关系,好了这个图呢,大家搞清楚我们这个基本的原理就可以了,就是说我这前三步呢,是不是得一个结果集,然后的话呢,我要处理结果集,我处理结果集这个代码决定于我传入的这个result set handler。实现类的handle方法是如何进行实现的,那我现在这个实现的话,我压根就没理这个result set吧,我只是记住了一个返回值,那个返回值就给这个result,就给这个result啊直接返回那好了,那现在的话呢,他觉得哎呀不理不好,这理一下。
21:18
我们理一下呀,过来这样写,你不是啊啊,你不是说干什么吗?你不是说查的这个全部吗?于是我真的就帮你查一下没有。R result set.has啊,点next,那我就写吧,ID等于result set.get in1。第二个等于。set.get string to第三个string email等于set.at一个。
22:16
Circle first等于result set.get it4,然后我直接创建一个,看看我等于六,看看我们是不是写多号器啊,是否可以直接的给我附进来,然后呢,我们把这个放到一个集合里边去这。Customer customer等于new,然后把这个放到这个里边去,Customers,点艾customer,并把它返回。
23:06
OK,好了,再看这个结果,这个结果是什么呢?这个结果是不是就是这个集合了呀,看效果你看哎,就是这个集合没问题啊,没问题行了,这就是我们整个的这个关于嗯,Query方法的这个原理,这里边的话呢,有一条非常重要的结论叫query runner query方法的返回值取决于results and handle handle的handle方法的返回值,只要我们把这个原理搞清楚的话,后边几个具体实现的。的这个呃。功能我们就会比较清楚,然后的话呢,我们要仔细学习以下的一些handle,分别是public b handle,好了,我们说一下这个b handle,那b handler的话呢,这个基本的流程是一样的,Connection connection等于啊。
24:20
Finally GC tools and release now now connection。1.2。Connection等于DBC.get connection OK,我们看我们这个handle德的名字叫啊,叫b handle,就是说handler这里边有有几个我们需要讲哈,B handler b list handler,呃,Map handler map list handler,还有一个skill handler,这五个handler我们需要重点掌握,其他一些handler大家可以自己看。
25:07
我当然我们也可以来举例哈,你直接看什么呀,直接看这个文档基本上就能够掌握的差不多,我们先来看这个叫B汉,看怎么实现,你看叫B汉。得到一个病,于是我们先看吧,写个string啊,Circle这个流程都差不多,Black ID name email first from customer ID等于问号,OK,等于。Na点方法好了,这里边有参数,最后一个next circle handles,比方说我们要获取第五个人的,好吧,这个的话呢,Connection写上好,这个的话呢,我们传入一个叫。
26:13
哦,B handler,大家看bin handle创建的时候需要一个什么呀?是不是需要一个class对象bin,因为我要把那个结果及转化一个病的话,我得知道转化成哪个病,懂我的意思吧。我要把那个结果给转为一个病的话,我得知道我转化成哪个病,要不的话我返回哪个病呢,我知道它有哪些属性呢,我如何去这个定位那个JA类啊,所以说写一个new in under,我们写。名字看点啊,哭了好了,跑一下sit out。Fat,看效果。
27:07
是不是无所对应那个卡这样就出来了,好了,我们要看一下它是如何进行实现。点query进来啊,那我们还还是我们看那个方法哈,然后它是点什么,这不是看要看RSH这个handle啊,点它这是一个接口T,我们找到b handle是如何进行直线的,好吧,然后他说什么,他说把这个结果集转为这个派,我们这块看到一个什么,这块我们看到一个说啊如果有下一条记录的话,我这样转这说明。这说明我如果这块这个返回值是多条记录的话,它是不是返回第一条记录啊,比方说这个我不加。
28:00
不好大于八。大于等于,看看五后边是不是还有啊,好了,我一个大于等于的话,你再看结果啊。它返回的是不是依然是第一条记录啊,它不出错,不出错的原理的话呢,就在这,你看它直接一个next好了,我们再往前看一下,再往前好了,我们看在这块进行调用的时候呢,它是不是自动的把这个result set给关了呀,而且是不是也把这个statement给关了呀,我们不用再去操心里边的result set跟statement,我们只需要管外边这个connection就可以了,好了,进来。看怎么实现呢,好了,转换。CTRT这个basic process好好看,怎么写呢?这块的话呢,我们看到了我们比较熟悉的这个什么叫呃,Result set Meta data,然后的话呢,它使用了内型机制进行转的,我们直接看这个create b好了点过来我们看首先的话呢,创建了一个对象,这个type是个什么东西啊,Type应该是一个class直接用的。
29:23
反射回来好吧,创建好之后的话呢,然后我们通过内景的机制,一个一个去调用set方法为这个B的属性赋值,然后把这个bin返回就可以,这就是。Handle的整个的这个作用和内部的原理实现。说病还的病。干什么呢,憨的把。
30:01
结果集的第一条。记录转为创建并handle德对象时传入的。Glass参数对应的。对象,哎,Handle德又干了这样的一个活,说把结果集的第一条记录转为。创建b handler对象时,传入对应的那个对象,你看懂不,看懂不,你看我创建这个时候,我是不是有一个customer class,它就把这个结果及转为那我能够查到的第一条记录,转为这个所对应的对象,这就可以了,这就是我们的b handler那边啊。
31:06
Public in east at,整个这个流程跟这个是一样的,CTRLCCTRLV。强大之处在于船的塞口。可以不一样,然后的话呢,这块我直接写一个b list handle就可以了,然后我们写一个list。他怎么了?I controy with all。看结果。Circle异常说返回的记录说参数太多了啊,这里面我是不是没有什么呀,是不是没有这个站位符啊,去掉。
32:05
你看就是返回所有的customer,所有的customer对应的集合,那这个叫什么叫b list handle,看怎么实现呢?Qua方法query。到了handle control t去找handle。转化成list ctrl t,然后它。再看。怎么办的呢?他说我要是没有下一行的话,我是不是会返回一个空的集合呀,就是说我这个结果返回的一定是一个集合,你不用担心那个集合本身是空。就是这个集合本身不会是闹,所以说你可以放心的去调这个集合的方法,但这个集合里边可能会没有元素,你看如果没有下一行的话,我是不是我是不是就直接返回来呀,然后的话呢,它做了一个循环啊,创建了一个一个的bin,把这个bin进行返回了。
33:13
好说这个作用是把野果级转为一个list,因一定是一个list list。该意思呢,不为空不为啊,我们刚才看到了。这子不会呢,但可能为什么呀,但可能为空集合,空集合是什么意思,我们写一下size方法返回零,它可能这样,然后的话呢,它返回这个例子是什么呢?说落。SQL语句。
34:01
的确能够查询到。住,那么list中放放建b listhanr。啊,创建传入的class。对象对应的对象不通哈,啊,如果思语就的确能够查到查询记录的话,那么list中存放创建并list里边存入的class对象对应的对象对看我这个时候的话,我是不会传入一个class对象啊,那我返回的就是它所对应的那个类的对象,你看它返回的什么,返回的是啊customer所对应的一个list,这就是我们的叫be list handle,那我们需要掌握的还有一个public avoid叫。
35:12
外看到了,看一下跟那个实线基本上是一样的,按我直接复制一下。C来好正。叫map handler,于是的话呢,这块我就要反馈一条记录,就是object。啊,我创建map handle的话,没有这么多事,Map handle这中间可以了,好了我们直接看结果。睡不着。对。See,没有结果。
36:00
啊,是什么收回一条记录啊,跟我们前面那个一样,我如果要是返回多条记录的话,我只用那一条记录,再看方法。看这个吧,Qua qua。Handle。The Apple tra。出卖我。比说D具体实现在这呢,咋实现呢?我首先的话呢,我创建了一个map对象,然后呢,我得到了一个什么呀,我得到了一个result set me data,然后我怎么了,我是不是直接往这个result里边赋值啊,这个是列明后边是对应的这个列的值吧。2s get object I这个方法应该什么里边呢?是不是到S里边呢,我直接进行赋值就可以了,这个代码的话呢,很容易看。回头看一下我们的这个看直接写了啊。
37:03
说爱看多少啊,说做返回吧,说返回circle口。对应港币。一条记录对应的map对象,好吧,那map的话呢,就会有键值对介值对剑是谁,剑是circle查询啊列名,注意并不是列的别名,不是列的列啊别名为啥不是别名嘞,是不看出来。不看呢?再看一遍啊,不是列的别名这么看。
38:06
大家看这不get靠拢name吗?所以说是列名,而不是列的别名,然后呢,直列的职位。哎,就可以了,这块的话,我们看到不列的别名,于是我们就想,诶,那我前面这个bin handleger跟be list handle,我还能用别名吗?我们看到能不能用啊。是不是可以用啊,到这个里边来,我们前面我们讲过一个招B说这个时候的话呢,衡量这个名字的应该是set get方法所对应那个名就这样写,叫customer name。CTRLC来C,然后我们再回到这个里面来,好了,我们来测试一下这。这是个什么情况,大家看这命名是不是空啊,好了,那我这个时候的话呢,我说我想用别名,于是这个别名实际上是建立了。
39:11
扎病的属性和。对应数据表列的一个映射啊哈同猫,那我就靠什么,我就靠这个别名去建立这个映射关系呢,再看是不是有了,哎,就是这样的一个特征,它可以因为这里边用的是内省,内省的话呢,可以直接绑定到我所对应的那个。扎病的属性名就是它可以直接绑射到custom name,或者个custom name custom name,而他用的直接是它,而不是那个列比好了再回来。这个可以了,那下一个就简单了,Public叫map list,看到了它好反回的应该是个什么东西啊,这不是map的一个list。
40:08
CTRLC过来ctrl a好了,说它返回的是一个map的例子,你是这么写啊,瞅这。这样就可以,然后完了看结果。大家看那边是个集合,然后里边这是一个map过来,是不是第二个map啊,啊有多少个就是多少个,N多个map怎么实现的,叫map list handle,我直接点开了哈,我直接看它的handle方法,这里边没有handle方法,Handle方法你在哪呀?你来这它的这个附列里边吧,搞handle方法看怎么搞的,先创建了一个list,然后的话呢,怎么了,然后的话呢,往这个list里边放的是处理结果集啊,我做了一个这个中做了一个循环,然后处理结果集再回来,它怎么调呢?C着T在这呢。
41:17
看怎么把这个结转一行再过来怎么转的T转呢,这个的话呢,我是只返回了。这个是不是反馈了一个map啊,而我刚才那个是不是N个map啊,那我一个map放到那个map所对应那个list里边是不是就可以了,好了,这个流程再看一下,再看一下,那它是如何让这个结果就往下滚的呢?回回看啊,到这个结果就往下滚的,我这块是不是只有一个2S点。我这块往下滚的,我每次调这个返回了一个map,然后的话呢,放这个里边,然后结果你指针往下滚一个单位,再返回一个map步又放里边,所以说它返回的是一个map步所对应的。
42:12
OK。这样写,说脉搏。看到了,这个作用是将结果集转为一个map的list。好了,Map是什么呢?Map。对应查询啊一条。记录好吧,这一条记录这个特征的话,我们刚才已经说完了,说见是什么只是什么C。OK,耳麦list复制吧。
43:08
List返回的,返回的是多条。记录对应的map的集合,就是map list handleer,还有一个比较重要的叫give,喊public avoid test吧,At s的话呢,是一个数值,我们直接复制过来,CTRLCCTRLV要直接是一个数值,什么意思呢?我可以这样来写,比方说啊,我返回一个啊,返回一个内。这样行。好吧,我现在的话呢,加上一个条件lid等于问号,然后我在调这个方法的时候,要传一个条件啊,返回五的name,但这个值呢,不是它了,应该是看OK,反正结果是一个自尊形。
44:24
什么?打错啊。Query circle handle,我看一下啊,需要进行强转,它返回的是一个object,我们的object好看结果。啊,杰瑞好,不但可以是这样的,还可以是啥样的呢?还可以是这样的。比方说这块我写一个ID没问题,好回来再看,这没有了啊,应该是五吧。
45:08
中还是六。五条记录,这呢,一共是五条,记录好了怎么返回的,看直接看他的憨哆方法,我翻。Handle怎么做的呀,它是不是直接把这个结果就往下滚一个单位,然后把这个结果直接返回来,就这么写,所以说这个比较简单,回来我们说一下这个。说把结果迪转为。一个数值返回啊,这个数值的话呢,可以是任意类型可以是任意。基本数据类型。
46:01
基本数。对类型和什么和比方说字符串贝等有一个要求,这有什么要求啊,如果你这块返回是两列,来我随便写给大家看啊,我返回一啊。嗯,我再写一个,嗯,他说这回他会正常返回吗?会吗?我们可以这个时候我们有几种办法,第一种办法我可以测试,我可以测试一下啊,返回他好了,然后的话呢,正常返回了,我们看什么呀,我们要去看一下这个源码是。怎么写的怎么写的,还是过来看他。你写的它是不是就返回了一个什么呀,他说啊返回了一个column midex,我打个断点吧,好看怎么返回的啊,为什么我在这种情况下我怎么写呢,我这种情况下的话呢,我写的这个,我写的这个搜狗语句跟这个结果完全不匹配吧,我这是返回多条记录吧,而且是两列吧,这个可以正常返回,怎么跑的跑一下第八个好。
47:22
好了,我们看一下什么呢?我们看一下这个column name空column,呃,Column me是谁?是不是默认这个默认值是不是一呀,点一下它这块没写没写这个值哦二这是一个final类型的,那你你看它是不是根据里边默认默认默认负的一个值啊,是一,所以说它默认会返回第一列的值。好了,以上的话呢,就是我们讲的这个关于呃。DB two里边查询的这个具体的实现原理和具体每一个汉字,大家看一下,还有没有不懂的,下课可休息一会。
我来说两句