00:00
来。现在我这个。Active type我已经获取到了,好,获取到flu了,好,我停掉了啊,现在可以把它停掉了,那大家帮我想一想,老师你获取了想干嘛?因为我们上面是不是写了一个叫anti class。我获取这玩意儿,它的这个叫get type name,我不就能知道它的这个大class了吗?哎,是不是啊,我不就可以知道了吗?那老师你获取他想干嘛呢?好。Class等于class点。那我是不是可以把这玩意儿。把它放进去。哎,是不是class这样我不就获取到了吗。好,我们圈开启一下。啊,对了,圈开启。这样就可以了,好这个把它去掉啊,好就是这样的,当然这个enter class你也可以不在这边去开启,你可以在外面直接写个死均码。String,然后就是全类名的这个全称嘛。
01:00
是吧,也其实也是可以的。好,这不是重点,重点是我们前面的三个步骤。这是重点,好好,那现在这个anti class我已经拿到了。嗯,Anti class拿到之后我就能解决一个问题,解决什么问题呢?解决这个地方的问题。我到底应该立出来的是什么实力我就能解决了。因为人家anti class,它有个方法叫new instance。是不是咱们反射里面的,我们可以通过new instance是不是也可以去创建一个实例对象啊,所以说这个问题我们是能把它解决掉的,它其实就是T类型。啊,其实就是anti点,然后我们再把这个list,再把它往里面扔list.at把我们的anti点把它放进去对不对,然后最后我们再list是吧,同学们这样是没有问题的。好,这边仅仅需要圈开启一下就好了啊,这边是圈开启,咱们先不管它啊再来,只不过呢,我们在列出一个instance的时候,这个实例当中的所有的属性应该都是空的。
02:08
对吧,它应该都是空的,我们需要给它里面的属性赋值。那么它里面的属性赋值取决于我所查到的信息。所以现在呢,咱们把焦点转移到上面这个结果集。好。这些步骤咱们都不变。然后再解析结果及这个地方大家注意看。在这里。我这步已经获取了一个结果集了。那么在这个地方。通过。S可以获取结叫结果集的原数据。那什么叫原数据?这个说的比较比比较晦涩难懂,原数据就是描述当前这个数据集的数据,就是表头嘛,哪些列明嘛,这个结果集里面有多少行嘛,就这意思。
03:03
啊,原数据就是描述数据的数据。啊,或者叫描述结果级啊,结果及数据的数据。啊,简单讲。简单讲就是这个结果集,这个结果集有哪些列?什么类型?共有多少条记录啊,什么类型就这么写就行了吧,啊,就是这个结果集也哪些类,什么类型等等就行了。好,所以呢,我给大家点一下,大家就能看出来了。S点。Get,它有个叫ma data ma data的意思,其实叫原数据。它给我们返回的叫result set data,那行吧,咱们就把它说明一下吧。啊,这个叫SMD。就这样的。叫result set data。
04:00
那这玩意儿里面可以获取什么呢?咱们看一下,点get column count裁一下呗。是不是可以获取总共你这个结果有多少列啊,不就列的数量吗?没错吧,同学们好,列的数量就有了。Get column name呢?不就是你的名字吗?Get column type呢?不就获取这一类的类型吗。只不过这个类型它有两个方式,一个是type name,一个叫type,因为我们在底层的时候呢,我们所有的数据类型,它其实都是枚举。虽然我们这边返回的是一个硬的,用整数去替代,包括咱们的返回值也是一样的。啊,Public protect等等等等,其实在底层的时候都是用数字进行存储的。比如说1025啊,我记得幺零二五指的应该是public等等等等。好了。所以你看不管怎么说啊,列的名字我们来获取到。
05:03
我们既然能获取到列的名字,那大家去想一想啊。比如说我们当前的float表,我们可以获取到类的名字叫fid。那你获取到fid的值,不就是想给我们刚刚那个NT点那个对象里面的fid属性赋值吗?大家想想是不是这样的?也就是说,我们查询出来结果集里面的列应该和我们实体对象当中的属性应该是对应起来的。没问题吧,同学们,所以好,现在我就要开始写代码了,我们已经思考的差不多了,SMd.get column count,我先获取结果集的列数。获取结果集的列数。好,看看。因为我获取了列数之后,我才能写负循环。2.0I小于卡count I加加。
06:03
哦,我才能知道你到底有多少列。你去想象一下,我们现在查的是表。复制表我们插出来是不是五列啊,那我问你这边是不是应该出现五五行啊。就这意思吗?如果结构就常用的是十列,那么应该出现出现十行嘛,那但是我这边要写通用代码嘛,所以我只能写成负循环。好点get。Get什么类型呢?不知道object算了。那当然我们get这个列的时候,是不是从一开始啊,咱们得写I加一,没错吧,同学们。好,我们这边写一下object,叫column value。好了,Custom value有了,其实custom name咱们也可以获取到RSMd.get name是不是也有啊?哎,获取类的名字嘛,I加一可以的,不啊,就是这样。啊,这样我们就获取可以获取这个列名,Get column name get column name这个里面是从几开始的。
07:04
点get name。In的看,那我估计应该也是从一开始,那我就写I加一啊,I加一行吗?同学们get name1get看NAME2是不是这意思啊,那行。String。Name。假设他获取的出来的是fid,假设他获取来的假设是数字33。请问一下我下面补是应是不是应该把33这个值赋给刚刚的这个an的这个实例对象的fid属性。是不是这样的?我现在应该把这个33这个数字付给这个对象的fid属性。假设我这个只是查出来,假设是苹果。我应该把苹果它的FM获取出来,假设叫叫FM。我现在是不是应该把苹果这个字符串要付给anti的它的FM属性?
08:04
再来假设我或者是五,我是不是应该它获取到的,看name叫price,我是不是应该把这个数字值五,是不是要付给这个anti对象的price属性。那这个负循环假设执行五次,那不就正好是五个列吗?我们这个anti里面的属性,它的属性值不就全部都装备好了吗?然后再把这个anti。再扔到这集合里面去,最后再把这集合,那不就完了吗?就是这么一个过程。好。OK。我们一起来看一下。我们把这个和这个,咱们要把它稍微合并一下啊,我们要稍微合并一下。呃,我这个地方有获取结果集的这个列数已经有了啊,第105号获取这个列数,然后我通过这个负循环呢,我是可以获取到每一个列的名字的。
09:06
嗯,获取到每一个列的名字,而且我是可以获取到这一列的值的。好。剪切。大家想想是不是?你外面是一是一条记录吗?外面的外循环不就是一条记录吗?在这一条记录里面获取第一列的名字,获取第一列的值。然后负循环。获取第二列的名字,获取第二列的值是不是这样的,就这个过程。在这个外循环内部,我们首先把这句话挪上来剪切。放在这,首先先创建出一个anti的对象,然后在这个地方我们应该是anti点,比如说setfid,咱们应该把column value把它放进去。只不过我这边是瞎写的,他哪里有set ID哦。
10:04
它肯定没有,或者我这边说哦,点fid等于column name,那它肯定不能直接写死的,写fid吗?那肯定是不行的,咱们得需要通过反射。是吧,同学们。所以呢,来。所以。我接待写在这边了。我写个方法叫通过反射技术给。Obj对象的。Property属性。负。Property value值。所以我写个方法,Private VO叫set value。有几个参数呢?第一个object。给OG对象的什么属性呢?Property属性。负什么值呢?Object property value值是不是这样的?
11:03
就是这么一个过程。所以我怎么给它赋值呢?Og.get class先获取它的大class对象。啊,先获取它的大对象,获取到之后点get declared field。我是不是可以获取这个名字啊?获取这个它某一个field某一个字段的名字吧,比如说fid是不是获取它的fid属性,那D属性是不是就是这个property啊。是不是就这名字啊,这样我就可以获取到这个field。就是他。好,但是我得判断一下你是否为空呢,如果你获取到没获取到,那肯定不行的,稍等一下啊,我们先去开启一下。好。获取property这个字符串对应的属性名。比如。
12:00
FID。啊D去找什么呢?去找obj对象中的fid属性,是不是这意思啊。比如ID这个字符串,去找obj对象中的fid属性,这样我就能找到它了,判断一下。If field。不等于,那你不等于,那我才能进行操作呢,field.set accessible把它改成to,这是不是强制访问,防止你这个属性是profit。然后fill的点是不是也叫set呀。哎,是不是啊。Set不就完了吗?OG对象把我们的property value把它放进去,为什么需要OG啊?是不是属性一定是某某某对象的属性啊?属性不能独立存在,一定是某某某对象的属性。行,再补一个开启。好。那这个我就把它写完了。这个方法写完之后叫set value,写完之后我再回到这边来,所以这句话咱们就把它删掉了,我们直接写一个叫set value。
13:03
那三在value里面,第一个obj对象把它放进来,那这个obj咱们这边叫是不是同学们所以把它放在这,第二个是我们的column name。然后第三个是value。没错吧,同学们。这样我们就把它设置好了,那这边咱们圈开启一下啊。我把它开启一下。这个地方是获取这个实力。嗯,稍等一下,让我想想啊,我要不要这边圈开圈开启这个代码啊,开启放在这。嗯,这是创建一个实例的这个。创建一个实例。创建一个实例。我把这叫封装一下啊,但是我一直在纠结,我一封装大家可能就感觉这个越来越复杂。啊,虽然说他只有一句话。
14:00
啊,已经很复杂了,那算了,不封装了。我直接艾特了啊,直接艾特,把它这个异常加在这。好。然后呢,这样呢,我就能得到这个类型。枪准一下。啊,其实这边不强准,其实也没啥问题的啊,还是要强转一下,因为你反正你这边要进行艾嘛,是吧。就这样子。那这些我都可以把它删掉了吧。是吧,同学们,这五行就不要了,删掉。好,这两行就把它删掉。这个通用的代码,我就把它写完了。没关系,反正我们录视频的啊,大家第一次听一定会听的比较懵啊,这这个是很正常的啊,所以大家课下再去慢慢消化,反正我们也录视频代码大家一定要听懂,其实我写的代码不多,其实写的代码不多,但是我一步一步分析的时间是比较长的啊,大家这个课下的时候再把视频再去看一看。好,那这个方法我就把它写好了,这个方法写好之后。
15:04
下面的过程,哎,那就比较舒服了。你这是一个get list,我这个方法你看这么多的啊,这么长代码了,我们现在只需要改成什么呢。Return super.q query。然后把这句话挪进来。放在这儿。我写完了。后面所有的全部删掉。是吧,虽然说大家觉得刚才代码多,但是你一看到这个应该还是蛮爽的吧。本来写了那么一大堆呢,是吧,现在咱们就只换成一行就可以了。好了,这是这个方法。那其实你像这种啊,单个查询,我返回的是单个实体,其实我们也可以在这里面去抽取。其实也可以在这个当中去抽取。比如说我再抽取出一个方法。执行查询。
16:01
返回单个实体对象。返回单个实体对象protected t类型,我写个方法叫load string SQL语句参数。好,那么这个方法怎么写呢?和这边长的其实几乎是一模一样的,无非就是下面返回的是list,上面只返回一个T嘛,所以这个串从这一直到这CTRLC拷贝一下。把它扔到这边来,然后。这些都不变。这些不也不变,无非就是这个Y,咱们把它改成if。然后一个T类型,然后经过一个负循环,经过这个负循环已经全部给它的属性赋好值了,所以直接return。然后在最后的时候,咱们return on。如果你能跑出来,我就追刀。那这个漏的方法我就把它改完了。所以这个漏的方法改完之后,这个方法又变得比较爽了。Return super点漏。
17:02
把这个搜狗语句拿进来,从这到这剪切,放进来补一个FM。然后下面所有的代码全部删掉是吧,它也就变成一行了。就是这样。那你看一下。啊,你现在你再来看一下,这些都不要。好就是这样,你现在你再来看一下你这个里面代码。是不是50行以内啊。是吧,这个代码应该就比较少,那有人那有人说老师你这个你这个骗我是吧,你这里面代码变少了,你这里面代码不就变多了吗?啊但是大家知道我这是通用代码。通用代码,我在一个项目里面,我只要写一次诶。但是大家要知道这个float的DA po,这个性质的DA po类会有好多好多诶。这是水果的一个DA实现类,我们说了是不是还有和用户DA相关的实现的呀,是不是还有购物车订单等等等等什么论坛帖子回复等等相关的呀。能听懂不?
18:01
能能听懂吗?同学们,一般情况我们的表假设你有20张表,咱们这个DAMP,一般情况你得有20个。是不是同学们也就意味着我们有20个三十五行?但是best玷污我只需要一份?所以呢,我们后面慢慢的我们写代码的时候呢,我们写DA的时现内大家就不用再去写那个反人的JDBC了,大家只要按这个套路去写就可以了,你就关注于你的搜狗语句嘛。你就保证你的搜狗语句能够写对啊,后面传个参数是不是就搞定了,具体的什么加载驱动,获取连接,创建预输的命令是吧?设置参数那一大堆就不需要关心了吧,是吧?同学们啊,我只需要去关注我自己的这个和业务相关的搜狗语句就可以了。OK。那行,还有最后一点点。我们best当中我封装了两个方法,其实我还可以再封装出一个方法,其实我们执行比如说select com信。
19:00
啊,类似于这样的select的看都行。啊,他查询出来的不是一个实体,他查询出来可能是一种是是一些结果,一些统计结果,好,我这边写个叫执行复杂查询。返回啊,例如统计结果。好,这个说是复杂查询,其实不复杂。我返回一个object的数组。Q。Complex complex,复杂的意思,Complex。好,搜狗一句OBBJ,点点点。这个其实一点都不复杂。想一想我上面这个漏的方法。我上面这个漏的方法,我返回的是单个单个实体CTRLC,我把它拷贝一份放在这里面,你想一想,现在咱们就不再去返回一个anma。我已经不再是一个暗店了吗?所以我应该怎么改呢?同学们,我这边是不是已经获取到列的数量了,列的数量其实就是我将来返回的这个数组的这个大小。
20:02
因此我在这边我就写一个object。我写一个叫,比如说叫column value,稍等一下哦,中国话啊。叫column value a等于new object,然后它的长度是不是就是column,看呀,哎,把这个column把它放进去,这样我就得到一个数组啊,得到数组之后到这个if里面来,这个an的不要。然后for用完。这个看其实也不需要。我们只要通过这个for循环,拿到这个kind of value,然后就一个一个往里面放呗。AR。中国话,爱。你跑哪去了?中I等于column value把它放进去。然后跑到for循环的外面去把它return一下,是不是就搞定了,那这个也不要,这个也不要删掉。就变得这样了,否则我就一个空的。是吧,这个方法我就把它写好了。
21:02
那行吧,这个方法虽然说没用到,但是后面会用到啊,后面咱们还是会用到的。呃,我们当前这个best do其实还不够通用,还不够通用,因为当前我们所查询的表是单表。如果我们两张表有外键关系,那这个时候呢,会碰到一些问题啊,也就是说当前这个best do,它只能够去适应单表的操作。啊,适应单位的操作,这个里面是有一些小的bug的,这个bug咱们先放着,反正大家现在也不知道是什么bug是吧,等我们做到第二个项目的时候,我再回过头来再和大家再升级这个类。啊,当我们碰到问题报错了,然后咱们再一起来思考,这个里面哪些地方咱们考虑的还稍微有点小问题。啊,到时候再说,目前来说这个已经够用了啊。好,我现在再来查询。好,我们来看一下啊。
22:00
好了,我们直接执行一查询。你看是不是也能查出来啊,只要能查出来,那肯定就是没有问题的。选择二,我们写一个叫柚子是吧。追加的库存呢,它是66加个十。天下成功再选一,哎,变成76了吧,那咱们再查看特定水果。名称,咱们写一个草莓。啊,那也是能够查到的水果下降。比如说刚才是35是吧,草莓。哎,对不起,没有找到哦,写错了。咱们水果下架应该是草莓,说的是名字是吧?好,是否确认下架?Yes,再选一草莓是不是就没了呀?好,就这样子好退出。那行说明咱们当前写的这个通用的代码啊,也是没有问题的。如果再进一步的再去说的话,咱们这个BA可以把它抽取成架包。我们其实是可以把它抽取能架包的。比如说你看。
23:00
Project structure,注意看我怎么把它抽取成加包,嗯,这个idea呢,稍微有点小麻烦啊,我们以前用的开发工具,我们用的是eclipse eclipse想要抽取加包,比如说你想把这两个类假设啊,想把这两个类抽取了加包,直接选中这两个类,右键右键它有个叫xport直接导出。竟然导致人家包啊,我不知道这个ID是是什么情况,他一直没有发明这样的功能,也有可能是我没找到啊,如果大家也找到这样的一个类似于这个这个方便的这个操作,大家就告诉我一下啊,反正我是没找到,那我只能按这样的方式来找,把它导成加包,这边叫rifact,这个叫压缩包。然后呢,我们这边可以写个价,我们可以写个空的。那这个名字,比如说我写个叫best do0.1这个版本,它会形成一个加包,叫best do0.1点加。然后呢,我可以把它这里面的这个。这个这个叫什么叫叫叫报名啊,可以把它全部写进去,我写一个第一个是com。好,再来,再添脚,我试试啊,艾特硅谷我用的斜杠,看看行不行啊。
24:05
然后do,然后best,我试试看。哎,说明应该蒙的还是对的啊,他都能给我建筑com at,硅谷float deal best,然后在这个下面我要把一个类把它加进来。啊,添加一个文件进来。好。那么我在这里面我就要找到best,这个不需要掌握。只是说到这个份上,给大家看一眼行吗?同学们啊,你就可以把这个加法文件加进来,这是我们加的是源代码。啊,加的是源代码,那么我们也可以去找到它的out。我们可以去这里面讲。这每次下的是不是大可对象啊。啊找一下啊,叫自建码文件是吧,点文件啊找到是不是这个啊,就是它点击OK,咱们可以把它加进来啊,这样就可以了,然后呢,我们把它导出,导出到什么地方去呢?比如说导出的这个out目录,输出目录。啊,咱们记住当前这个项目的这个up目录这边有个黄颜色能看到吗。啊,露出一点点啊,这个out好就在这应用。
25:02
好,点击OK。然后咱们选中它,我们点一下build,叫build model。点它一下。阅完之后我们打开,打开1.5看一下啊,稍等一下啊。嗯。他这边没有吗?不可能啊。Build完这应该有的呀,重新再来build artifacts点它啊,刚才是build model是吧,叫build artifacts点它,然后best do0.1看到没有,点击一下build。是不rift就有了,打开是不是里面就有家包?看到了吗?然后我们就可以把它加包啊,稍等一下啊右键。找到他文件所在的地方。你看这是不是就是我们自己写的夹包,我们之前用MYSQ的那个连接数据库,是不是用的是人家MYSQ的夹包,所以所以所以说大家不要觉得架包这个很很深奥,架包就是压缩包。就是压缩包里面压缩了一些这个Java Java文件。
26:03
啊,压缩好的这个压缩包,这里面的加班类,咱们可以直接用,就这意思。这就是加速包,所以呢,如果咱们这个项目,你想一想,这个项目如果我们把best删掉,然后我们把这个加包CTRLCCTRLV复制到这个library里面,是不是一样可以用啊。能听懂我意思不啊,就是这样,那行,那这边我就不再去演示了啊,肯定是可以的,只是当当前这个best丢我建的这个包呢,还不是特别的规范,为什么呢?你这个best是通用的,但是你看它的命名空间,它这个包名是不是出现呀,我们最好是把这个best挪到com and的硅谷下面某一个通用包。比如说。com。At硅谷,然后直接是best do.best do能听懂吗?就和具体的项目无关了吗?这个大家能理解不?啊行,咱反正现在仅仅是给大家演示一下,不着急的,后面我还是会给大家演示,把它抽取的加包,然后呢用运用于我们的项目。啊,就是这样的。
27:00
好了。
我来说两句