00:00
好,那么刚才呢,咱们是把这个通用的增删改操作呢,就搞定了,增删改操作完了以后,下一步我们来看一下这个查询怎么来做,查询的话呢,大家可能想,诶,那那个套路是一样的,诶整体来说套路是一样的,对,但是还有一些区别,对要更复杂一些,因为这个查询的话呢,我们需要处理你查询以后的这个情况,你就比如说咱们在这里边写一样啊举个例子,咱们在这个SQL要里边写一个SQL语句的话,如果我们这是个增删改操作,举个例子,比如我这个update update咱们叫order,然后set叫order name等于这块我给大家再重新赋个值,比如我附上这个叫勾勾啊,然后where啊,Where order ID等于比还是一个二,这个咱们说了这个order呢,你给它加上这个张线是吧,好,这个呢,我们执行一下,这呢是一个增删改操作啊,点开执行进行完以后呢,你看这块呢,其实你可以理解成呢,就是没有任何返回的情况,但是对于我们这个。
01:00
查询来讲就不一样了,我们要是select啊,比如来一个星from。这样order,然后加一个where也行,比如说where,然ID等于一查询一下order ID是一的,这样一个员工信,这个奥尔信息出来了,这呢是有一个结果的,那我们把这个呢就称作叫结果集,这是叫结果集,那么这个结果集在咱们Java当中,我们说万事万物皆对象了,那就意味着当你在Java里边写个查询以后,你得返回一个结果集,这个结果集呢,得拿一个类的对象去充当,因为你要操作这个对象了。那恰好呢,我们在Java里边呢,这个呃,接口它不是一个具体类了啊,因为我们JDBC里边都是定义的规范了,这个接口的话呢,恰好也就叫做结果集叫result set,那我们这里边这个查询的难点就是你得知道如何去处理这个result set。啊,那回过来啊,你看一下咱们刚才说了,说整体步骤跟自然改类似,比如说刚开始你也得获取连接,也得是预编译SQL语句,你这写一个select的一个查询,你要查什么,比如where ID等于还得是一个占位符,所以呢,填充占位符还得有,关键呢就是这块有区别了,增删改的话呢,我们广执行完以后就完事了,现在呢,你查询的话呢,还得需要有一个结果集接收,接收完以后呢,再看看结果集里边我们怎么把这个数据啊,一个一个的给取出来,取出来以后呢,诶,你再看看你是想怎么用,那我们可以暂时考虑把它也封装为一个类的对象来去输出一下这个对象,所以我们查询的难点呢,其实在后边,那我们能不能写一个通用的查询呢?
02:43
这里边儿所谓的通用,就不像说自然改,人家是三个操作啊,叫通用了,那我们通用的查询就一个查询,那上哪叫通用啊。对,针对于不同的表了,是吧,像咱们这里边说通用的增删改,其实是两个通用的角度,一个呢就是针对于增删改叫通用的写一个就行,另外呢,针对于不同的表,诶的一个通用,那咱们现在查询的话呢,就只有查询操作了,那你这个通用呢,指的就是针对于不同的表的。
03:10
那你想想,我们要针对不同的表的这个难度其实还是有的,那咱们再写一个通用的针对于各个表的操作之前,咱们先写一个针对于具体的表的,先体会一下,好,那这块呢,我们就诶这个prepare的这个CD操作里边,我们先写一个针对于具体的某一张表的,这个我们写个class,嗯,我们有一张表呢,叫customers表,在这呢,我就要customer了,哎,咱们一会也得生成一个类啊,叫customer customer呢,For query。Query就是查询的意思了,分类好,这个呢,我们做的事是叫针对于。哎,针对于咱们这个叫诶customers表的一个,哎查询操作,这个查询呢,其实你要加个通用吧,也行,说这个都一个表了,还通用啥呢,你查询的时候呢,你查的字段多少是不是也不太一样啊,所以这都是一些变量的问题啊,所以这个呢,我们查询的话呢,针对于你不同的字段,我想这会儿我select语句,我查俩字段,一会儿写写仨字段,一会写四个字段,这个你也得能用一个方法来帮我搞定,所以你也可以说是针对这个表的通用的,呃,查询各个字段的这样的一个查询操作了,行,那我们就先写一个这个一般的啊看一下。
04:28
嗯,Test这个我们叫一。那针对于咱们这个customers表的,那刚才也说了,前面这几个操作呢,其实都还是一样的啊,前面这个操作都是一样的,那这块我就直接来写了啊jdbc us,第2GET一个C,哎,获取个连接,CTRL1呢,先把这个异常呢给它throw出去,在CTRL1诶我们生成一个连接的对象。第一步第二步预编译SQ语句对吧,第二叫prepare statement,把这个SQ呢传进去,SQ没有提前提供。
05:03
我们现在呢,想做的是个查询,那我就select select的话呢,看看这个表中的这个字段。打开表,ID name email birth波动呢,暂时先不考虑,所以这四个段呢,比如我们都想查,那就都写上ID name email和birth from customers。那这时候呢,我们只想查一条记录线啊,先不整那么复杂,那就是where ID等于写个展位符,我是通过ID呢进行查询的,你也可以通过name啊,Email啊,Words都可以,那circleql呢放到这里边,这叫预编译SQL语句CTRL1得到一个prepare的statement的实例。下一步下一步就有区别了,这个是跟咱们前边的这个不太一样的地方啊,前面呢,我们说叫执行,诶前面呢,咱们是点叫excute执行,调的是这个方法,现在呢,咱们就不能调这个了,因为我们希望你得执行完以后返回一个结果集了,所以我们叫excute,它有个方法叫做cute query。
06:08
哎,我们需要用这个方法,那么执行完query以后呢,我们明显看到它返回了一个叫result set,就叫做结果集。所以呢,这块我们就要执行SQL语句啊,这个我就别写SQ了,写SQ呢,你会误认为说这里边好需要,好像还需要传SQL一样,其实不用啊,说执行并返回结果集。这呢是跟我们刚才写的增删改不一样的地方,上边一样,所以我们就快速的过了,那么返回结果集以后,我们下边的重点就是来处理结果集。这也是我们现在的一个难点,怎么处理结果集这个下边的操作呢,跟咱们当初讲集合中的迭代器稍微有点像,哎,七个长中长接待器的时候,比如我们这块呢,我写一个查询语句。就比如说咱们刚才这个事儿。
07:03
CTRLC粘过来放到这儿,这个我就不写问号了,我就写一个,比如一。查询这个数据执行出来了,这就叫结果集,只不过呢,这里边只有一条数据,大家呢,你可以把这个事儿,嗯,你就给它看成是我们集合当中只有一个数据了,那集合中要有好多数据的话呢,咱们当时讲过的是用迭代器进行一个遍历了,那么我们先通过这个集合这样一个对象点这个方法反应过迭代器的对象。然后呢,咱们先调的方法叫是不是叫has next,判断一下你这个对应的集合当中的下,呃,第一个位置,下一个位置,其实是因为你一开始是在这个首位之前有没有元素,有元素的话呢,调那方法获取这个元素,再调那方法再获取,再调再获取,依次获取,咱们现在的话呢,只不过相当于这个集合当中啊,就一个元素而已。就这一条数据,它一开始的这个指针,咱们这呢叫迭代器,咱这呢叫结果集,它也有个指针,这个指针呢,也指向在第一条数据的上面,那我们呢,也是调它的某一个方法判断一下呢,有没有数据。
08:12
因为有的时候,比如我们这个ID呢,写的是100,显然呢就没有了,所以我们也调它那个方法,有的话呢,我就接着操作,没有就退出了,所以他这也有个方法,这个方法呢,只不过不叫has next了,它就叫做next result set里边有个方法叫next方法,这个next方法还跟它不一样啊。这个ne方法呢,返回值是个布尔型,言外之意呢,就是这个ne有点像他对吧。但是还不同于它,咱们对比的说,咱们讲迭代器的时候说he next,它就一个作用,就是返回一个波尔形,表示呢,下个位置有没有元素,这个指针下移的事儿是不是它来做的,Ne方法有俩作用,一个呢叫指针下移,同时呢,将你下移以后的这个位置上元素给返回了,它有俩作用一跟二,而我们这里边这个耐方法呢,它一方面。
09:02
是我们has next的作用就是我会判断一下下个位置有没有元素,这是相当于是它的功能,它还有一个功能呢,就是这个next的第一个功能就是指针下移,就是如果说你next方法呢,是一个触,就是相当于我们找到元素了,那这时候它指针自动下移,如果你这个next的时候呢,发现下一个位置没有元素,它返回false,它也指针不再下移。能理解吧,诶清楚这个以后呢,那我们现在就可以说,针对这个结果集,我们首先调它的那方法,看看它下个位置有没有元素,那很显然呢,我们这要掉的话呢,是不是就是初二因为查到了一个元素,那查到这个元素,注意它长这个样子啊,这么长好几项呢,我们是不是得想办法一个一个的取出来啊,那这个呢,既然在你结构机当中,结构机呢就给你提供了相关的方法做这个事儿了。好看一下啊,来处理结果集,刚才我们提到了拿着这个结果集呢,要调它的一个方法,这个呢,我们就直接写个if,如果这个结果集调那方法说明呢,你下一条是有数据的,如果要有数据,我们下边就要出级,如果要没有没有说明你就没查到东西就直接出去了,对吧?那这个处理结果题主要是我们在这里边来写。
10:18
在这总结一下我们这个耐方法,它的一个作用啊,就是嗯,判断结果及。在这个,哎下一条哎是否有数据。说如果有数据返回处,嗯,并指针下移。嗯,指针下移啊,那么如果返回false,那么就直接呢,就是指针不下移了啊,指针不下移直接结束。啊,指针不会狭移,就是它相当于我们原来讲的迭代器里的has next和next的一一半的那个功能,对吧,一半那个功能,它没有返回值的那个作用啊,这是我们说的这个next方法,它的一个诶作用,哎,这个大家注意一下怎么用,那么如果你要有数据的话呢,我们就进去了,进去以后的话呢,我们下边要做的事儿是不是就要获取当前。
11:18
哎,这条数据的各个字段值啊,我们现在这对应的是不是一条的意思,这一条里边呢,各个字段的值不就是这个ID name email和birth吗?那那下边我们就来做这个事了,怎么做呢?这个结果集都封装在它里边了,它呢有相应的叫get方法,比如我们第一个呢是ID,显然呢,ID是一个int型,那我们就可以这样去写get int。那这里边呢,就是column index,仍然呢是从一开始的,所以我们这块写一下这个一,那很显然这个一就是我们查询到的这个第一个字段了,这个呢就是个int型的ID。然后接着result set,第2GET一个string,因为我们第二个呢是一个name了啊,就是string型第二个字段拿到的就是一个name。
12:08
哎,这样,诶类似的,我们在result set get一个email呢,又是一个STRING3。嗯,这样来CTRL一生成一个叫email,嗯,最后一个呢,是一个是一个date,这result set.get一个date,嗯,Date呢是我们这个SQ下的一个date了,这块我们写一个四。CTRL1,这是我们得到的是一个first。行,这就得到了这样几个字段了,哎,挺好啊,那得到这几个字段以后,其实就我们这里边获取到这几个数据信息了,那我们怎么去处理几个信息呢。啊,一方面啊,这个我们算成一个方式一吧,那你就直接显示,比如说这个ID等于哎,加上ID逗号内等于,然后email。
13:03
等于嗯,再加上这个叫birth这个咱们整个逗号,那这样的话呢,就做了一个呈现。但这样的话,我们去处理这几个数据呢,感觉稍微的有点low,对这种方式呢,一般咱们不建议了啊,那还可以怎么做呢。诶,方式二的话呢,我们可以考虑把这几个数据呢,封装在一个数组当中。倒也行是吧,那数组里边呢,你就是那你这块要统一的话呢,只能是object类型的数组了,哎,数组这是我们这个data数据,因有一个object,然后这里边的数据呢,就是我们这个ID name email和birth这样对吧。保存一下,那这里边儿呢,我们传的这几个具体的数值啊,这写懵了,怎么写这里了。这管是吧,嗯,这就行了,那这种方式的话呢,其实也不是特别的好,因为这里边几个字段的这个类型其实也都不一样,那最好的是怎么办,集合集合呀,也就说讲了数组,那就用集合去替换数组是吧,这个别用集合了吧。
14:14
用一个对象吧,应该对啊,我们这里边呢,是几个字段,ID name email bos,其实呢,就相当于我们Java类的几个属性值嘛,哎,所以这块呢,我们应该把这四个信息呢,封装在一个类的对象当中啊,这是比较合适的,那么我们下边就需要去创建这个类,好,下面我们去造这个类。新建一个包,这个呢,专门来放我们雷雷的这个,我们都说通常这个扎病了嘛,所以诶这个叫病了。嗯,在这里边我们就创建啊,那创建的时候呢,我们这个类名不妨呢,就叫做customer。哎,就要这个类名分类,那么这个类里边呢,到底都有哪些字段呢?都有哪些属性呢?是不是要参照我们这个表啊,看这个表了,ID name email words这个字段呢?呃,属性呢,要参照这几个字段,那么这个字段的类型在这改变表一下,这几个类型是不是也就决定了我们这里边的一个属性的类型啊,所以这里边我们就涉及到了一种编程思想。
15:17
前面给大家稍微提到过叫OM的辩证思想,嗯,这个OM叫object。啊,Relational。埋平对象关系映射,哎,对象关系映射具体的体现呢,就是我们让一个数据表对应一个Java类,哎,表中的一条记录对应Java类的一个对象。那么表中的一个字段对应Java类的一个属性,那这个呢就很清楚,那么这个呢,就是我们OM思想的一个具体的体现,那么我们已经知道这个具体的这个表的信息以后呢,回过来我们这个类呢,就比较好声明了,这呢我们声明成是一个Java病了,所以呢,类是一个公共的,同时呢,这个属性都给它私有化啊,那这呢就涉及到另外一个问题,就是说我们在数据表当中,像相应的这些数据类型跟我们Java这块呢,是怎么一一对应的,这个我们课件里边有一个。
16:25
嗯,关于我们这个叫对应关系这块在这呢啊,哎,先把这个熟悉一下,在SQ里边呢,如果有这个叫bit,那这个呢,在我们这是波尔型t int,这是bad型small int short型integer int类型包括呢,我们这个SQL里边呢,在MYSQL里边也有那个int了,那对应过来呢,还是我们这个int,然后big int long char what char long ver char,在Oracle当中呢,叫what two。哎,Work two就后边写一个二,这是Oracle当中这个字符串的一个可变的一个类型啊,嗯,在咱ma里边就work串了,这个呢,对应过来叫string啊,还有它这个相应的这个对应关系啊,注意呢,这个date是我们数据库里边的常见一种数据类型,对应过来呢,是我们搜下的data。
17:12
哎,还有下边这个对应关系。OK,那知道这个lo的话呢,不行了啊,Lo的话呢,我们这块lo你是放了一个图片,这个图片呢,可能最大的我们说达到四个G呢,是一个视频了,你过来我们Java里边呢,不能单纯的你去拿一个对象去对接四个G吧。你得是一个文件对吧,诶存储下来的一个文件才行啊,你可以说呢,我们有个file对应的那个文件啊,四个G这样行,诶这就是lo的这个情况。行,那知道这个对应关系以后呢,那我们也知道这里边这个情况了,我这块呢,就好写了,Private in型的ID string类型的name,词缀类型的email date类型的birth。
18:00
行,那这个lo类型呢,咱们暂时呢,先不往这里边去放,后边呢,我们专门来说一下这个lo circle,然后我们去生成相应的这个,首先构造器,空单构造器。代餐的过道器。改善方法。投资人方法。这样写代码确实很爽是吧,是50多行出去了啊嗯,行,那基本上我们就写完了,这就构成了一个javain啊,那完事以后呢,把它关掉,我们就可以把数据呢,封装为一个对象。诶,对象这个呢,是咱们的一种推荐方式,好又一个卡什玛奥斜杠,嗯,ID name email bus,正好这四个字段都有,然后CTRL一来声明一个customer,这呢我们多一个打印啊,Customer相当于调用它的图存方法搞定,那这呢就相当于你要是查出来这个结果了,我们就输出一下你这个对象,如果没查出来,默默的就结束了,直接就蹦到这儿就行,那没有结果了,我就不用处理了,好,那处理完结果级,其实这个事呢就完事了,最后呢,关闭资源,这个关闭资源呢,除了我们说的这个连接prepared statement result set呢也需要还。
19:17
他也需要关,那既然如此,我们还得是修改一下咱们这里的关闭资源的操作了,那关闭资源的操作这块,我们在不改变它的情况下呢,再去新建一个,新建一个关闭资源,诶那这里边呢,无外乎就再多一个构成一个方法的重载。Result set这个写个RS吧,诶这个呢,我们给它导入,接着导的时候呢,一定是咱们这个SQ下,咱们现在都是面向接口编程,里边不会出现任何第三方的API的,那把原来的这个呢,我们先CTRLC拿过来,在这个基础上呢,我们再给它补一个。嗯,这个result set,诶保存一下搞定这个呢,也可以加一个注注释,那也是我们关闭资源的操作,OK,行,那我们下边调的话呢,就调这个方法就行啊关掉了,下边在这关闭资源jdbc us,点2CLOSE resource来选这个连接prepare statement resource set。
20:24
这个咱们用的是这个名。保存一下,好,这呢就搞定了,那写完以后呢,这既然出现关闭资源的操作了,保证它一定得执行,Rose呢不合适,所以把这个呢再干掉,诶从头到尾又得给它这样包一下这样的啊,点右键做一个哎,Surround的位置拆开,这个我们就还按照一种方式来处理。嗯,这个咱们已经做过很多次了。嗯,把这个咱们往下移。
21:00
好,最后这个FINALLY1定要加上把我们关闭资源这个操作呢,给它扔上去跑一下看看。走,OK。有问题是吧,啊,没有指定具体参数一。这个里边呢,我们去对写完它以后呢,没有填充占一符是吧,我们这里边存在一个占位符没有写,所以这块呢,我们需要补充上,诶点去set一下OBJECT1我们想查谁,这个我们想查汪峰是吧。诶,第一条数据呢,这不是汪峰吗。那特意把王峰放到头条的位置了是吧,嗯,第一条数据啊,诶填充完张F以后,然后再来。哇OK,诶这就出来了,诶这呢就是我们通用,呃,谈不上通用了哈,这呢只是我们针对于customers这张表,哎,我们写了一个查询操作,是这样写的。
我来说两句