00:00
来,下面我们接着来看。今天这个上午的时间啊,今天上午的时间,我们得把这个呃,JDBC结束掉,要不然这个时间会有点紧张啊。嗯。GDBC其实它的这个怎么说呢,其实它的步骤是非常清晰的,它的每一步操作啊都是非常清晰的,所以呢,GDBC其实对于大家的要求是他的一个熟练度。大家一定要敲的很熟,一定要敲的很熟啊,来,我们再接着来看啊。这是PROJECT04,我把它复制一份CTRLC。到这边来根据V,然后呢,我把它改成叫PRO05。我把它改成float1.3JDBC好。我把它重命名一下CTRLC。到这边来把它改一下CV好OK,然后呢,我们把这个模块把它加进来是吧,同学们,Project structure。然后呢,我们找到model,我们点击加号,我们找到import。好。
01:00
然后呢,我们找到零五,把这个打开,点击OK,点击应用。哎,这个也有没问题。那行,这样我们就把他加进来了。好,下面我们一起来开始考虑对于查询的这个优化,帮我来想一想,我应该怎么做呢?我们看这个当中。比如说get list这个方法。这个方法我说明了一个集合。呃,然后呢,我获取连接。再往下我有个搜狗语句,再往下我有个叫PSMT啊,创建预测的命令对象,再往下执行查询,然后呢,我们解析结果集,然后释放资源。这是我们针对于fruit fruit它的一个查询获取一个列表,那其实对于其他的,比如说商品,应该也会有get商品的一个list的这么一个操作,那对于订单应该也会有get o的相关的list的一个操作,是吧?也就是查询的表是不太一样的,但其实我们这个步骤应该都是差不多的。
02:02
所以呢,我的想法是我在best do里面,我想去再抽取一个方法叫执行查询。执行查询,那我返回的是什么呢?返回的是一个list。返回list,也就返回的这个列表。所以,Public。或者我们和这边保持一致,我们写成protected protected list啊叫XQ的。那你这边肯定是词句啊,四个语句不太一样,那参数估计也是有可能会不一样是吧,同学们啊,这个是一致的那行。好,这个例子我们去导入。OK。再来那这个查询的话。这个查询操作。我们应该怎么来写呢?我把这个里,这个里面的内容啊,List这个当中内容从这里。然后呢,一直到这里,我就把第一个list声明以及最后的return,我没有把它复制进去,其他的我全部把它复制进去。
03:02
然后回到这边来。好,把它放在这边。请大家帮我想一想,第一步,获取连接,不管你操作哪一张表,这一步肯定是要的。搜口语句没事,这是四口语句,人家外部传进来的,所以这个第三步我可以删掉。是吧?好,创建预处理命令没问题。这个注释我删掉啊,再来创建预处理命令没问题,那我下面是不是要设置参数啊,设置参数其实也问题不大,其实和这个代码是一样的吧。哎,是不是同学们。和的代码应该是一样的,因此我就把它代码剪切,我放到外面去。Private void setup,因为两个地方都需要调用,那我就把它变成一个方法嘛。Prepare statement。Object点点点。然后把这玩意挪进来,好,这边我们录一下就可以了。把它思路后面去。我是不是把设置参数提取出来了。
04:04
给预处理命令对象设置参数,我把它提取成一个方法,那么我这边我是不是调用一下这个方法就可以了。Sets p SMT,然后把我们pers把它放进去,没错吧,同学们,我调用一下这个方法就可以了,然后我下面是不是也是一样的。哎,放错地方了,我们应该往上面放。是不是同学们放到这边就可以了,然后我要去执行查询吗?设置完参数我就要去执行查询,执行完查询下面我是不是就要开始解析结果集了。好了,同学们,请大家帮我想一想,嗯,我们解析这个结果集的时候s.get。s.get in第一列一定是int吗?不一定。大家一定要跳出我们float那张表的思维,因为我们这边想写的是通用的代码是吧?同学们啊,你不能光关注于float,我们float表第一列它确实是自动列,但是呢,我们不一定能够保证我们所有的表的第一列都是自增列啊,都是整形。
05:07
还有一个问题是。嗯,这个表我们查询的这个表到底有多少列呢?我这边写的是12345,诶那是因为咱们服务的表正好有五列,没错吧,那如我们查询的表如果有十列20列怎么办呢。所以我感觉这个地方啊,我们解析结果集碰到了一点点小的问题。好,其实哪怕哪怕我们这边获取的列获取到了,获取到了我到底要列出什么类型的对象呢?我这边float列,这是我拷贝过来的。因为之前我们查询的是float表嘛,所以我知道我列出一个float对象,封装了一个float对象嘛,但是如果说我查的是其他的表呢,你肯定不能列出float。那我到底应该六出谁呢?这也是一个问题。好。看好了这个方法就返回,返回一个列表,列表里面每一个元素是什么?每一个元素不一定都是float吧?
06:04
啊,我们说了,我们这写的是通用代码,所以我这边写个T。这个T。这个T从哪里来呢?我们可以把它放到这个类上面去。通过这个肋,这个地方的这个地方把它传入进来。别人在继承我的时候,给我指定一下这个T的类型,那我这个方法里面T类型就把它确定下来了。再说一遍,这个T的类型是依据是什么,这个T到底是什么类型,它依据。这个地方的T。那么这个地方T什么时候能确定某一个具体的某一个具体的DA类,在继承我的时候,要给我指明这个T。能听懂我的意思吗?指明这个T的时候,哎,这个T它的类型就能确定下来了。好,这是我第一步做了一个小的改动,所以我这边既然有个T之后。我可以在这边声明一个T类型。
07:00
I。大家想想是不是,然后最后我可以把这个list把它出去。可以吧,同学们,我可以把它出去,但是。我们刚刚说的这边第一个问题是到底要获取哪些类型,其实这个获取类型还好一点,我们可以get object。我不知道你是int float double还是string,还是get,我不知道你到底是什么类型,那我就直接get object好了。但是还有一个问题是,到底要获取多少列?我是不确定的,还有这个T这个类型,我要得到T这个类型的一个实例对象。我总不可能写个6T吧,那是不行的。是吧,同学们这样也是不行的啊,这个T它仅仅是一个符号,它不是一个类的名字。如果是一个类的类名,我们是可以六这么写的是吧?但它仅仅是一个符号而已,要注意它不是一个class的类型。好。
08:01
先不管它,我刚刚反正已经说了,你这个T的类型取决于这个地方的T,那么这边的T是在我继承的时候要去指明的,现在我就直接把这个float DA看好了。他继承best丢,我就要给他指明一下弗鲁特。能看得懂吗?我在这边要去指明一下,弗洛特好。再来。在我们这个best deal当中。在我们best当中。好。Private。Class,我写个class。这个叫anti class。我想让他就是T的class对象。T到底是什么类型?我想获取T的类型,其实就是说我想获取T的大class对象。就像一个float,我想获取float它的大对象一样的。那这个anti class,也就是这个T,我到底怎么去获取呢?
09:01
好了。我把它的构造方法把它写出来。Public best do,这是它的构造方法,我们子类在六的时候,是不是在他的在他的构造方法里面默认第一句话就是CU小括号呀。C小补括号是不是会调用负类的无参构造方法呀?好。我在这里面,我怎么去写呢。我这边要写一个叫。Get class.get叫generic super class。叫get generic super class。Class class是不是负了啊?S classes fully。好。那也就是说我要获取他的那个泛型啊generic class。
10:01
再来。点。这个尖super class大家可以先看一下啊,它到底是什么super class,它获取的是一个type类型。他获取的是一个叫type。那么这个type呢,稍等啊,我先把它写出来。Type等于它。好,这个genderric type呢,我其实是可以把它强准强准为它的一个子类型叫per,叫叫per。这个啊,叫parameter什么什么什么type,哎,记住就叫参数化类型。这玩意儿叫参数化类型。啊,这个单词的意思叫参数化类型,我可以把这个尖,这个type可以把它强转一下,可以转化成它。那么转化成它之后,我就可以去get,叫active type arguments,我来一步步来给大家解释,不着急啊,一点一点的来。
11:11
第一个叫参数化类型,我把它强转为它什么叫参数化类型?我这是一个best do,我这后面是不是写了一个小间号,写小间号这边是不是表示一个是一个占位符。表示将来继承我的时候,别人是不是可以给我指定类型啊,那这个T是不是就相当于是一个参数啊?请问一下我这边的语法可以是不是可以支持abcd,可以写很多的,那你想想这不就是参数吗?是吧,同学们,这就叫参数化类型。啊,这就叫参数化类型,那只不过咱们当前只传了一个嘛,我们并没有传这么多而已。那行,再来。这就是所谓的叫参数化类型,然后呢,我们后面有个叫get active active叫实际的。
12:01
获取实际的类型参数,就是说我这边写的123456,我写的六个占位符在这边呢,那将来呢,我他继承他的时候,你实际传进来的类型是什么。你实际传递进来的类型是什么?我这边就可以通过get active type arguments来获取到。它获取的是一个S负数,因为这个小电号里面可以能会写很多呢啊,占位符会写很多呢,当然咱们当前呢,我们只传了一个,我们并没有传很多,所以它虽然获取出来的是一个数组。它虽然是一个数组,但实际上只有一个,所以我们就直接获取第一个。Type arguments中括号零,我们就能获取到这个类型了。Active type,我把它写在这。这就是我所获获取到的类型啊。
13:00
获取到的。这个。啊中的T的真实的类型。我就可以获取到了active type,我就可以获取到了,那通过这个active type可以干嘛呢?我们可以看一下,它有一个叫get type name。Get type name是什么呢?咱们可以把它打印出来看一下这个叫类型的名称。啊,我们可以把它打印出来看一下。好,我把这边注释呢,我把它补全了。这个get class。同学们。这个get class是什么?获取的是best deal还是flu deal?考一下大家。这个get class。也就意味着这个get class到底是当前的调用,它的实力对象是谁?我们将来溜出来的是不是fruit do?
14:00
我们6FLOAT的是不是会调用负类的无参勾的方法,所以说这个get class虽然我们写在负类里面。但实际上get class我们其实是通过子类的子类的这个实例对象去调用的,是吧,同学们。所以它获取叫泛叫泛型负类嘛,所以get generate class其实获取的是best do小监小监号T嘛。是吧,同学们啊,是这样的。好。Get close。表示获取大class对象。获取大对象,当前啊,当前我们执行的是6FLOAT do po。然后呢,我们当前我们执行的是6FLOAT do啊创建的是float do po的实例。好,那么啊,那么子类构造方法内部首先会调用父类,也就是best do。
15:06
的构造方法,无参构造方法。胡菜。构造方法是吧,因此,因此此处的get class会被执行。啊,会被执行。但是get class。获取的是啊,获取的是float do m po的大对象。啊,然后因此啊,所以。所以我们后面写的一个叫get。啊,获取到的,获取到的是best do。的class。好,就是这样的。那行,咱们在这边设个断点,咱们一起来看一下。其他的功能咱们先不管。我们先把这个active type。看一看。
16:00
这玩意儿到底我们能不能获取到?好,呃,这个里面它报错,我看一下啊,它是哪个地方报错,点一下账。哦,这边咱们没写全是吧,同学们。是吧,解析,所以我这边我就把它注释掉了,行不行,同学们,其实这些玩意儿其实也可以注释掉,因为我根本执行不到这。没错吧,同学们啊,还没执行到这呢啊,我们的目的就是在构造方法这边执行,在这边看一下就可以了啊。行吧,反正他不报错就行啊,只要他不报错,这个不要删掉。嗯,我们回到main函数里面,我们来试试点第八个。好,我们来看一下啊,好,他现在已经进来了。进来之后呢,我们来看一下啊,这个叫generic type,我们点它。这个generate type大家看一下,能看到我后面的这个信息吗?Generate type是不是指的是best do小坚固号flu呀?
17:08
能看到我这个后面一个一个弹出的一个一个一个东西吗。应该能看到啊好啊,叫best小监float,然后呢,我们再去叫active type arguments,我们再去获取。这时我们会得到一个数组。当然这个数字里面T10它只有一个,是不是啊,它只有一个,我们打开。啊,它里面只有一个,就是一个float,因为咱们小键号里面就只传了一个嘛,所以咱们active type咱们可以把它获取到。Active type,那你看一下active type它是不是就是呀。没错吧,所以说我们get type name是不是就可以打印出它的全类名啊?看到了吧。这不就是他的get type吗?不就把全类名打打印出来了吗?那我们同学就觉得奇怪了。老师,你要获取权利,你想干嘛呢?
我来说两句