00:00
那么针对于这个customers这个表,我们想一想,咱们能不能写一个通用的,这只是写了其中的一个操作啊看一下。Public word这个咱们是想写一个叫query query for,谁呢?For customers这个表。这个呢叫针对于customers这个表的一个通用的查询操作。通用的这个查询操作。那怎么叫通用,你看哈,说这个这这不就是这个表吗?这是通用啥呢?我们要再查的时候呢,我这个字段多少可能不一样呀啊哎,这个字段呢,多少不一样,直接影响了我们再去执行这个if结果及处理的时候呢,这个是不是多少就不一样了,所以这都是问题啊,那现在呢,我们现在写通用呢,其实就是想把这个变的东西给它来写成个通用的,好那我们来看一下怎么去处理这个问题,首先呢,前面这个操作其实都还是一样的啊呃,那么做一个查询变的东西呢,我们还是生命在这个方法的形态这块,这个呢,其实你一开始空着也行,咱们先写,写的时候呢,哪些不确定了往上补,对吧,比如说首先获取连接,这个呢,是个确定的直接点,Get connection。
01:25
CTRL1啊,这个就抛了个异常了啊,先抛出来在CTRL1哎生成一个连接好下一步第二叫prepare statement啊,预编译SQ语句,生成一个对应的prepare statement SQ呢我不知道你这个查询里边有几个字段了,所以我们这呢,把这个哎生明成一个参数。这是第一个先,然后CTRL1,哎,生成一个prepare的statement,下一步填充占位符,这个呢也一定要有,所以我们跟增删改操作一样,哎把这个呢先写上,下边呢叫填充战略符。
02:00
In的I等于零,Last I加角。哎,这个位置呢,小心一点啊set of这个呢要写成I加一,哎X哎哎,这样叫填充占位符,填充完占位符以后。下边是不是该执行了ECU query做一个查询,此时呢,返回一个结果集。哎,我就捡起了叫RS了。好,下边这块也是我们这个查询里边的一个重点,拿到这个结果集以后,我们下边呢,就要处理量在处理了,咱们现在呢,Per for customers,我们希望返回就一个对象,所以这块我就别写word了,我给它改成就返回咱们一个customer。啊,就返回它啊,这个暂时报错呢,是因为我们目前没有写return啊,那么我希望你返回一个对象,那就意味这个结果集当中,我们要查的话呢,其实也就查一次,所以咱们这就写成个if了。你说你这不写衣服写啥呢?不写衣服还可以写外。
03:02
的时候呢,就是我们回头是不是紧紧接着写完它以后,我们可以写查多条数据是吧,哎,就改成个while就行,现在呢就一条,所以我就一幅一次啊执行一次这个next,那如果你要是有数据我们就去取。取的时候那有问题了。取几下呢?对吧,取几下啊,哎,你看下边这个,我们这取了四下,这四下决定由谁决定的,是不是这决定的,哎,由这决定的,这个呢,要查的是四个字段,这四个字段呢,决定了我们的这个结果集长什么样子。把它CTRLC再拿过来给我写个一执行。这四个字段直接决定了我们结果级的一个列数,那现在的话呢,我们要想拿这里边的几个值,而且呢,还想写一个通用的操作,那我必须得想办法能够拿到你这个结构机到底有几个列吧。
04:06
那就相当于我现在要获取结果集的是不是这个列数啊,OK,没问题啊,那获取结果集的列数,第一想到的就是拿着这个RS点说GET1下列数列呢,当然人家这方法名不一定就是按照咱们想的这样去做的是吧?嗯,当然你不管怎么去试呢,这里边都没有没有一个直接获取结果器的列数的方法啊,没有方法那就做不了了,哎,其实呢,也能做,只不过呢,它没有生成在我们result set里边,它将这个列的这个列数它封装在一个叫结果集的原数据当中了。诶,那这块呢,我们要想获取这个列数呢,咱们需要做这个事儿啊,拿着这RS,在这个if之前点,我去get一个叫Meta data,然后CTRL1得到一个RSMD,这个我们叫RSMD,就取得这个首字母了啊结果L集的原数据,这个呢,又是咱们现在写这个通用的查询里边必须用到的一个啊,这个我们重点说一下啊,叫获取结果集的原数据,这个咱们在讲基础的时候呢,提到过,这个原数据在哪讲的。
05:13
注解啊注解那时候我提到过叫圆柱解,对,就是你修饰现有注解的那个注解叫圆柱解,那现在呢,我们说什么叫原数据呢,就是来修饰你现有数据的一个数据,对吧?哎,咱们当时给大家不是还举了个例子说,比如我这叫name,哎这个呢叫Tom。说呢,这里边的核心的数据呢,其实就是Tom,然后这个name和string呢,一定程度上来讲都是来修饰Tom的,所以可以理解成是这个Tom的两个原数据,诶,当然是这样说的啊,那现在的话呢,我们是叫结果集,那你修饰这个结果集的呢?诶,我们把这几个数据呢,封装在你这个原数据当中,这就是我们说的这个result set me data啊,就是它啊,那我们可以通过这个结果集的原数据来获取结果集当中的列数,那通过result set me data获取,那结果集中的这个列数怎么做呢?就是RMd.get一个叫column count,这就是我们的列数。
06:21
哎,就出来了,这个我们拿列数记着你要干什么啊,我们下边呢,主要呢,是因为我们结果集要get,咱们上边呢,调的时候说get啊get string,这个你现在呢,写成一个泛泛的写法了,是不是就get object了?对的啊,那get object,关键呢,就是我们现在要get object几次,这个次数是由他决定的。那因为大家脑袋得清楚啊,现在我们这个if服呢,表示你对接到某一行了,但是这一行呢有好几个列,我这个列呢又得写个循环,循环几次,我要调这个方法呢,就由我们刚才说到的这个column countt来决定好,所以这块我们就可以写个for了,In特I等于零,I小于column count I加加。
07:08
这样,然后把它呢扔进去,这个位置怎么写。哎,加一,记着要有加一,因为这个我们仍然是从一开始的,小心一点,那2s.get object这个相当于我们就获取到了你这样的一个字段的值了,对吧,CTRL1这个值你就别想着再强转了吧。你哪知道他先查的是什么字段啊,我这个select先查ID,我下个字段先查name,这个你就没办法去强转了,所以只能是这样写对吧,这个呢,我们就写成一个咱们具体的返回的这个结果集当中的这个值了。这个我们是一个啊,具体的一个value吧。哎,这个数值拿到了YIG呢,就我通过这个for循环Y6呢,一四就能拿到一汪峰具体这个邮箱和这个boss了,那接着怎么办。
08:02
这是咱们这个查询里边最难的一块啊,也是我们JDBC里边可以说是最难的一块了。对啊,那我拿到这个对象这个拿到这个具体的数据了。我拿到数据呢,咱们的目的呢,跟原来一样,我需要呢,造到一个对象当中。那这个对象的话呢,我需要把这个属性呢,按照你这个拿到的这个数据呢,附上值。那我先得,呃,那端就造对象两种方式,一种呢,就是我们直接在构造器当中,把这个属性呢,就直接填进去,另外一种呢,就是你先造一个空参的对象,然后呢,通过那个赛的方法呢,把这个属性给它设置进去。那这个应该用哪种,应该用第二种,为什么不能用第一种呢?我第一种那个构造器不一定有啊,你像咱们现在这个问题当中,我这个customer我就提供了一个空餐的一个四个参数的,那万一要用户就查三个参三个字段呢,我就根本没有那样的构造器的支持,对吧?所以这块呢,我们建议呢,就先诶用空单的构造器,先把这个对象先造出来,然后呢,你看你查什么了,你查的那个字段呢,我调一个下列方法给你设置进去,对吧,你看这样的思路。
09:12
好,那我们就先把这个对象找出来,显然呢,对象就造一次就行,所以没有必要写到这里边儿了吧。或者写这里边儿也行,写这里边行,但是你不能写到for里。对吧,哎,这个你看我们customer customer我就拗一个,哎,Customer这个之所以我们造的是customer,就是因为咱们现在呢,是针对这个customers这个表来说的啊,有一个OM的一个编程思想,我们这块对应的就是customer这个类了,所以我们造的对象呢,就是他这个对象呢,也也得写在这儿啊,写这儿呢。从结果上来讲也行,但是呢,不建议写这,你说万一说你这个查询的时候没有结果集,就是你查的数据根本就不存在,我还给你造个对象,是不是有点浪费啊,就是你查到结果了,我才帮你造对象,对吧?所以写到这是最合适的,那不能够写到这里边儿吧,对这这绝对不行,对,咱就一条数据横向来看,按一条数据,所以只造一个对象,那现在的问题就归结为我要给这个对象。
10:15
某一个属性名复制为value,是这意思吧?写一下啊,我们要给cost cost这个对象指定的某个属性。诶,赋值为我们上面这个Y6,那现在问题就是哪个属性啊,肯定有,你得告诉我哪个属性吧。啊,那就相当于哪个属性,那我们一看这,诶我这个里边呢叫ID,结果集当中,我这个叫ID,恰好你那个类里边是不是有个属性也叫ID。嗯,我这个叫name,诶你有个属性也叫name,我这叫email,你那也有个email,我这叫Bo,你这也有个Bo,那这样的话呢,我们就想办法获取结果集当中的列名吧。
11:09
我只要拿到这个列名就行,我就把你这个列名对应的Java类当中的那个同名的属性,是不是就复制为这个值就行,哎,就可以了,那怎么去赋呢?我们需要取出来这个列名了,这是我们这个问题获取,你不是拿到这个位置上的这个值了吗?你这个位置的名叫什么呀?其实这块大家写着你会发现我们这块是不是奔着反射去的了。因为你现在试图写的是个通用的操作呀,可是反射的不就体验这种动态性嘛,你想查两次段,OK,我就给你设置两次,你想查三段,我给你设置三次,所以现在我们实际上是奔着反射去的啊,这也是我们反射的一个具体应用场景了,说获取每个列的。是不是列名就可以了,那这个列名的话呢,很遗憾我们这个结构集呢又没有了,所以这块呢,还是通过结构集的原数据啊,都封装在它里了,这就SMDCTRLC怎么整呢,它点我们就get一下,叫column name,具体哪一列呢,I加一等一零跟咱们这个套路一样,所以这块呢,CTRL1诶我们就得到这个,哎,我们叫column name。
12:19
哎,拿到了,那这个叫name,其实这块呢,这个value其实就相当于是叫column value对吧?哎,我们叫column value了,这呢是你这一列的这个列名,这呢是你这一列的这个列的值,我们现在需要给cost对象叫column name。指定的啊column name的这个属性是不是复制为column value啊,怎么付是不是就要通过反射呀?来顺便呢,咱们再复习一下反射啊,那现在的话呢,我们这个类是谁呢?是不是就是我们这个customer这个类了,那这个类里边我是不是需要去找叫这个名的那个属性,把那个属性对应这个对象的值复制为它,这就典型的调用指定呃运营实类的指定属性了,并赋值的操作好这样写啊customer回忆一下。
13:14
先点class.get declare的,咱们确保呢一定能掉吗?这样的一个名名呢,是不是叫column内叫这个名的这个属性先拿到,嗯,这个呢,我们就叫做build,拿到以后呢,这个属性呢,有可能它是一个私有的,所以我们叫set accessible处,哎,能访问了,然后呢,我们把这个属性名的啊值设置给我们这个当前的cast赋值为column value吧。你看这是不是就搞定了,哎,这是我们这个最难的一个地方啊,这块大家要理解了,那后边呢,当然也谈不上说那么一马平川啊,哎,当然呢,后边这个难度都没有它大,这是我们最难的一个地方,诶,我们将这个对象叫这个名的这个属性,这就针对这一列了啊,这是相当于咱们在处理每一列数据处理啊,这个一行结果集。
14:17
哎,一行数据中的啊,中的。每一个列。你看,所以这块我们写了for,循环取出你这一列的列名,这呢是获取这个这一列的列值。然后呢,我们将这个对象的叫这个名的这个属性复制给这个值,那这块呢,全是动态的来实现的,因为我也不知道你到底要插几个,我也不知道你这个,嗯,回头这个表那个字段呢,到底怎么起的,因为你可能查俩,有时候查仨啊不确定,所以我们都是通过反射的方式来做的,那么当你整个这块呢,搞定完这个逻辑以后,在这块我们就可以去return这个cost了,这个cost呢,不光是一个对象了,它里边呢,还有你这些属性的值都该附的都附上了,哎,这就我们说的这个问题,好,这个呢,你是附上的情况,那也有可能是不是没有附上。
15:15
呃,不是不是没附上了,就是也有可能你这块查的时候没结果嘛,所以我这块呢,就给你闹啊这个位置行,然后的话呢,我们诶这就相当于我们要做的事都做完了,那记者这块把资源关闭,你不能写这了啊,得写到这块了,这是jdbc us,这是我们的一个收尾工作啊,Resource close resource连接pss啊。哎,就这样来写好,那这个写完以后呢,整个这个los呢,也不能这样来写了,把它去掉是吧?哎,整个呢,我们从这到这包一下。来,到这儿报一下死亡的位置,来这开始。这有点多啊。哎,把这个呢,我们给大家扔进去,嗯,这个这个还扔吗?这就别扔了是吧,这些扔了上面这都白写了啊,因为最后都return闹了上了是吧,在这啊,然后最后这块来一个哎闹。
16:20
诶,那啊保存一下行,那这里边的一个核心的操作,就是我们这里边遇到了这个几个问题啊,第一个诶,我们想获取你这个列的列数是是多少,包括呢,获取我们这个呃,列的名字是叫什么?这个我们都借助的叫结构机的原数据,然后这块我们还用到了反射的这个情况,所以这里边我们算成是哎两个技术啊两个技术呢,一个呢叫结构机的源数据,哎另外一个呢叫做反射,哎只有这两个结合在一起,我们才能够搞定这个操作,学完以后呢,我们来测试一下有没有问题。Test,那这个我们叫query for customers。
17:03
行,咱们调的话呢,就是这个方法,嗯,调调这方法我们需要传这样的两个参数,写一个四针形的circle select啊ID,咱们先写这个字段稍微多一点的first,因为诶这个先写谁后写,这有问题吗?没有的,嗯。From customers where,我们通过ID来查吧。车库放这ID。嗯,这个咱们比如再随便挑一个啊,ID是13。嗯,这个呢,然后CTRLL返回一个customer打印。哎,保存来测试。嗯,没问题是吧,诶这个呢,是我们查的这个这个你换个数,这这都一样了啊,然后现在呢,我们想再查一下,就是这个字段可能没这么多啊,这个circleq呢,我们直接在这来换了啊,我叫SQ1直接呢,我在select,我想查一下这个name,查一下这个email没了,From customers where,咱们这个也换一下,我通过name来查吧。
18:13
这呢是一个张瑞符啊,你要这样写的话,那这块我们就得再重新的再写一个这个方法的调用了啊。Circle呢,放进去,这时候我们想查一下。比如周杰伦。嗯,这样就可以,然后CTRL1,这样得到一个customer。这个叫E。来保存,来测试。哎,也是可以的,这时候因为我们光查这个周杰伦和他的邮箱了,这个都没查,所以这块呢,这个值都是零和no,这为什么是零个no是在我们哪块赋的值啊,是不是你当时你有对象的时候呢,那个默认值啊,哎,对,诶因为下边我们给这个属性赋值的时候呢,只附了你查的这个字段了,没查字段呢,就是当初你的new对象的时候,空三过道器的那个默认值,行这个呢,就我们针对于叫customers这个表写了一个通用的一个查询操作,哎,通用的查询操作啊,这个我们把这个操作呢,CTRLX是吧?诶通用的一个查啊,这是针对我们这个整个这个类的啊,针对这个表搞定以后呢,那大家呢,诶,你可以想我们换一张表写一个通用的查询,然后呢,诶两个表都体会了以后,我们再把这两个表再提取出来,写一个通用的,针对于不同表的一个通用的查询,那就可以了。
我来说两句