00:00
那下面做讲师的条件查询带分页功能,那这个功能该怎么去做,首先给大家先做个分析,然后咱们用代码给它现出来啊,咱先分析一下咱们怎么做这功能,就刚才把这个基本分页功能我们已经做过了啊,就这个功能我们刚才已经做到了。啊,这个画条线啊,特别区分一下,然后下面给大家说这个就是条件查询待分页,我们该怎么去做啊,因为咱们今天呢做的是接口,咱还没有写那个前端页面,但我这里边给大家先简单画个页面,因为咱用页面更好理解这个功能啊,那我来大概画一下啊,然后再用它来说明咱要怎么去做这个功能。比如说现在我们做的功能,它就叫做啊,其实说的更严谨一点啊,它应该叫这个名字叫做多条件组合查询带分页功能啊,咱要做的叫这个功能,那这功能怎么做,给大家画这么一个页面的效果啊,咱大概画一下啊,比如现在假如我这里边有个页面。
01:08
啊,比如说就是这么一个一个页面啊。然后比如说在这里边呢,假如说有我们那个就是讲师的那个数据啊,数据列表里边有,那现在这个列表中,咱肯定可以做那个分页,那分页呢,一般来讲,在你这个数据的最下边会有一个叫做分页条的过程,在分页条各位应该都见过,一般有这么几个结构,比如说有一个叫。首页有这个叫尾页,包括有一个叫上一页,还有这个叫下一页,以及中间有你的具体页码数,比如说123等等啊,这是一个分页条,我觉得各位应该都见过啊,包括咱们在之前,不管你是外部阶段还是框架阶段,这种分页应该都写过啊,这叫分页,分页的接口那已经写过了,然后除了分页之外,咱要做功能叫做多条件组合查询功能,什么叫查询?比如说现在我这个功能,咱刚才是所有啊这个操作,但是比如说现在我想根据条件做查询,那怎么做呢?咱一般来讲在我页面的上面会有你输入条件的部分,那比如说我们大概写几个条件。
02:20
比如说里边啊,比如第一个有那个,就是比如说讲师的名称啊,比有个条件,假如第二个有什么讲师那个级别,比如他是什么高级讲师,各级讲师,第三个比如有讲师这什么啊,比如他的什么其他的一些数据啊,那我就按照我课件中这个例子了啊,课件中是写了这个例子,就是你讲是这个入住的开始时间,结束时间,就是讲是什么时候注册它里边这个时间范围啊,那我们就加个时间范围。比如有一个开始时间,这里边有一个叫。结束时间啊,那里边假如我们现在有这么几个条件,条件位置咱肯定可以输入,或者说可以选择这个条件。
03:02
有这些啊,然后这些都有之后在这个上面,最后咱可以有一个按钮,就是一个叫查询按钮啊,咱肯定有这么一个东西,所以这是一个简单的页面的效果,而这效果我们要怎么做呢?比如说我现在啊,就是假如说我在里边的,我输入一个讲师名称,比如这个名称呢,我输一个叫这个张,我想查询姓张的所有讲师,那这是一个条件,当点查询,根据他是不是可以做个查询,就做一个张的这个模查询,比如第二个我说一个级别,假如说级别是一个高级讲师,那我就查姓张的高级讲师这个数据点查询是不是查出来,然后第三个是时间就开始结束,假如说开始时间我查这个2019年这个1月1号。然后结束时间,比如说我查这个2019年1月31号,这是一个时间范围,然后咱点查询这些条件,是不是能查出我们最后的数据啊,包括查入数据,让他做到一个分页效果,这叫多条件查询,那这里面一个词叫组合,什么叫组合呢?希望各位应该能想清楚啊,你注意啊,比如我现在。
04:16
我这里边只查名称,没有级别和时间,是不是可以查,比如我现在只查名称和级别,或者我只查名称和开始时间,或者说只查开始结束时间,不查名称级别,所以你注意刚才我这些描述,这些条件是不是有不同的组合情况,我可以查名称和时间,可以查级别和时间,可以就查名称,可以就查级别,或者说我都有条件,或者说我现在。让他没有任何条件,那他肯定是查所有啊,所以这个叫多条件组合查询,但是咱们在多条件组合查询基础之上会加上这么一个分页啊,这是我们要做的这么一个功能,就是多条件组合查询带分页功能啊,所以大家把就知道啊,而这种效果我觉得各位应该都见过。
05:07
比如说我们在网上买东西的时候,咱们不管是去京东和淘宝,你在搜一个东西,举个例子啊,比如我们现在搜一个手机,那我可以搜索就是这个颜色是白色,比如它那个品牌是什么,华为的这个手机,这是一个条件,或者我搜索上市年份是一九年以后的,是不是一个条件,这就叫多条件组合查询,另外查完之后咱可以带分页啊,这叫做我们要做这个功能。啊,所以大家知道我们要做出什么效果,咱今天是写接口,然后咱后面会写它的页面部分。啊,这个啊,给大家做了一个分析,那这个怎么做,给大家来详细说一下这个基本步骤。那我们来写一下啊,首先我们要做的。第一步操作啊,大家注意啊,在第一步的时候呢,比如说咱分页肯定有这个当前页和每月技数数这两值,咱肯定需要,另外除了这个之外,大家注意啊,我这些就这些部分。
06:07
是不是条件呀,而我条件值是不是也能传到我的接口中去,就在我接口中得到你的条件值,咱是不是要得到,只有你得到条件值之后,是不是才能做那个条件查询啊,所以第一步操作,我们就是要把条件值传到咱那个接口中去啊,这是第一步。我写一下啊,把我们的条件值。给它传递到我们的接口里面去,那这怎么传给大家强调啊,就是它有多种方式传,但是咱们开发中一般建议各位用一种方式来做,怎么做呢?我写一下啊,写的通俗点就是咱们啊可以把这些条件值。啊,把这些条件值给它封装到一个对象里面去,然后咱把这个对象给它传递到我们的接口里面去啊,咱一般都这么做,就是一会儿我们写这么一个实体类,用这个对象封装,然后在我的接口中直接通过对象形式传这些值啊这是我们做到的,而这个对象在我们术语中咱介绍一种叫法,不知各位是否听过啊,就这个东西叫一个VO的一个对象,就你的值对象啊,用它都传递,因为它就包含你里边这些条件值,比如你的名称、级别,开始进入时间,那咱一会儿第一步就是建一个VO类,用于专门传递条件那个封装的那个部分。
07:33
啊,这是第一步啊,是怎样做到的,所以大家知道这种思路啊,咱一般都是用对象进行传递。那这个说完之后,下面咱来写一下啊,那咱就来到我们的代码中,首先关掉啊,然后代码中呢,我就在这个NP里边,咱为了区分我在里边呢,再建个包,就要这个VO。然后在VIVO里边,咱们来创建一个类,让这个类用于封装咱的条件,比如这个类我就叫这个teacher。
08:03
Query啊,就是讲师查询的这么一个类。这是我们创建的啊,然后创建之后根据你的条件,这些东西在里边建属性,大家可有这个名称,级别,开始和接入时间,那咱就创建四个属性,为了我们做封装啊,这是我们要做的,然后这个属性我就不挑一遍了啊,我从里边直接就复制了,等于为它就是这么。四个属性啊,就这四个啊,我把这个直接拿过来了。啊,这个简单就不带敲边啊,然后我把它注解加上就是一个date啊,这依赖引入。咱看一下啊,这么几个,第一个讲师名称,第二个讲师级别,因为在我们表里边,咱看一下存的级别是一和二。啊就改成就是一和二啊,就是它是一是高级讲师,二是特级讲师,存一和二,所以第二个写个in特类型,第三个就是开始时间,第四个是结束时间啊这是我们写的四个属性,用它来拥有我们数据的一个封装啊,这是我们做的第一部分,建这么一个类,写上属性用于封装。
09:11
然后这个写完之后,咱们来到CTRL里边。在CTRL中写这个具体方法就是咱说的第四个。这个方法就叫做条件查询带分页的这么一个方法啊。那我们来写一下啊,首先这个方法就是用什么提方式,其实有些特点啊,我先写get,比如说咱说明这里边有一些地方啊,比如说给它起个名字,咱就叫这个配置。Teacher,因为它是条件查询嘛,我再换个名字叫这个condition。在这里边,首先他就算做条件查询肯定要分页,分页中呢,肯定需要这两个参数,一个当前页,一个每的技数数,啊这咱刚才刚写过,我把这直接拿过来,然后下面写方法。
10:00
Public返回类型肯定是R啊,咱统一都是它起个名字,比如就叫这个名字,然后起完名字之后在里边呢,咱要得到它的相关内容,首先第一部分这两个值要得到,就是当前页每个记录数,那得到方式咱们刚才写过啊,我再写一遍啊,后面我就都复制了啊。我写个浪,第一个叫。Current,这是第一个值,就是当前页还有第二个值,这个叫long limit,就是每页记住数,然后除了这两支之外,刚才我们提到,因为咱们做条件查询的时候,这个条件是不是要穿过来,所以咱们在我们这个接口中要得到这个条件,但是条件怎么得到,咱用对象做碰装,所以在里边我们的做法就是咱直接写上这么一个对象,就这个叫teacher query。啊,写这个对象t query,这样的话就能得到条件值,然后后面咱会在前端做这个值的分工,现在我把这值直接写过来,这个用对象形式得到你那个条件啊,我们这么来做。
11:08
然后这个做到之后,下面我们往下来做,写一下里边的具体代码。当然这个代码我先强调啊。就是在我的课件中啊,是写到中,我先写到,我先多给大家写到C中,后面咱再慢慢改造啊,我先不写service,直接就写这个control了,然后它后面有很多功能会写到这个service里边啊,我在里边直接写了。那怎么做,第一步创建一个。配置对象啊,那我们来创建啊,这个叫edu。然后这个名字叫配置,等于new上一个配置在里边两个参数,一个当前页,一个每个技数,啊这是它的第一步,然后做完之后第二步操作,咱就可以调用方法实现那个。条件查询带分页功能啊。
12:00
那我们来调一下啊,这个方法啊,你看这个叫teacher service里边这方法刚才咱们刚用过,它叫配置。当然各位注意啊,在配置方法中两个参数,呃,为了区分改个名字啊,第一个参数就是咱们new这个对象。然后第二个参数呢,咱要用这个条件,而条件就是一个叫rapper。Rap怎么用,不知说各位是否记得啊,咱在上节课曾经提的讲过啊,然后咱来快速回顾一下啊,然后咱之前就用了rap用法,就是在买中有一个对象是这个叫quality rapper,那我们就直接new这个快rap,然后用里面的方法可以做到啊,咱们就是这么来做,那这里边我来写一下啊。写到上面啊,就那个这位置啊,我们就是要构建它那个条件,咱写一个叫query rapper,加上一个叫edu,然后写个rapper,等于new上一个快rapper。
13:05
啊new rapper,然后通过rapper里边的方法写它的内容啊,这个咱一会儿写啊,我先把rapper先传进来啊rapper。然后这样的话啊,这个可以传过来,这条件构建咱一会儿完善啊,先把这结构写出来,然后写完之后再配置teacher中有咱们最终这些值跟咱上面就一样了,咱把值取到,然后最终做个特就可以了啊这段代码我就复制了,刚才咱们刚写过啊这个代码。你把这个total和Rose给他做个返回啊,所以这是一个基本的一个结构,我们就写出来了啊,然后结构咱们看一下啊,第一个就是。我们做条件查询带分页,分页中有当前页,每个技术数条件查询咱用个对象做分割啊,这用个对象直接传过来,然后传完之后第一步new这个对象,然后捏完之后咱要构建条件最号调方法得到结果,然后得到结果之后咱把值取出来,最终做个返回。
14:07
主要这个过程,那咱最后就来构建这个条件,把这个再来做一下啊,那咱看怎么做啊。这里给大家特别说一下啊,因为我刚才特别提到咱们这个名字是不是叫多条件组合查询啊,它叫这个名字,它叫做多条件。组合查询,那什么叫多条件组合查询的,也就是说啊,我这些条件值是不是可能有也可能没有啊,可能都有,也可能都没有,所以咱们现在要写的话,如果说条件值没有的话,那咱就没必要再写,比如我现在没有那个name,那咱就没必要再写个rap设置它的内部值,那咱怎么做呢?给大家说明啊,就是这个过程中呢,不知道各位是否记得啊,咱们在那个买碑体的阶段。曾经学过一个东西,这个东西叫做。
15:03
动态circle。比如说各位是否有印象啊,咱在买币的阶段学一个叫动态circle口,就是你在叉L中用判断,然后来拼接SQL语句,这是咱们当时学到的,而现在要做的就就这过程,只是咱们现在没必要去动态拼circle,咱直接怎么做呢?给大家说明啊,因为我的条件值是不是可能有也可能没有,那咱做个判断是不是可以了,假如条件值有,就是它部位空有值,那咱们来拼接条件,假如条件值为空,咱是不是就不需要拼接条件,跟咱们之前学那个动态circle比较类似啊,这个位知道啊。如果说我说这动态circle各位不知道,或者你感觉没听过的,那你把买悲剧阶段那东西好好看一看啊,这是当时我们应该是买阶段特别学过的动态搜考,只是现在不需要这么做了,因为咱们用这个框架它会特别方便。
16:00
那我来写一下啊,该怎么做?我小的位置啊,咱就是判断。条件值是否为空?如果说不为空,咱就来。拼接上它那个条件啊,就这么来做,那咱来判断一下啊,首先我先来一个if啊,咱一个判断,因为咱有四个值嘛,而条件值应该都在这里边。啊,我先这么走,外天值先都取出来啊,然后再判断,首先第一个值就这个内啊,就是咱说那个讲师名称。然后里边第二个值。第二个值应该是这个叫level啊,就是讲师的级别,另外还有第三个值。就这个叫begin,就是你讲是那个注册的开始时间,就是一个范围,还有最后一个teacher query.get and讲是那个注册的接出时间啊,主要有这么四个条件,那咱下面就是判断这四个值是否等于空,如果它们不等于空,咱就把这条件给他拼接上啊,就来做判断,那咱们一个来判断啊,就判断应该都差不多。
17:11
那怎么判断?这里我强调啊。首先啊,就是在这个过程中呢,我们要做判断,比如说各位是否记得啊,有个工具类,就是你判断就是它这个东西啊,不等于空,或者说不等于空字符串,用这个做判断,那咱现在就来判断一下啊,那怎么做呢?咱有一个工具类。这工具类。注意啊,是spring包中的叫U。这工具类中可以有一个字符串的判断,然后这个方法它叫这个意思empty,比如咱传个name,这就表示这个name值它为空,或者说为空字母串,那咱们表示它不等于空,咱在前面是不是加一个C或者一个感叹号啊,这就一个判断,用个工具类做个判断,如果说它这值不等于空,那咱在里边就来。
18:05
构建它的条件,我们加个rapper点上这个条件啊,这些方法之前我都讲过了啊,但是现在用哪个方法呢?因为我们现在比如说啊这个name,我想做个叫模糊查询,那模糊查询有个方法都要记住啊。是不是这个like啊,Like里边两个值,第一个它那个字段的名字,我们叫name,第二个是它那个具体值,就咱说这个name啊,这是我们构建一个条件,就是这个第一个值写的是你这个字段名称,咱字段这个叫name啊,然后值就是你最终传这个值,这是我们做一个判断,然后剩下三个判断写法跟他应该一模一样啊,就是咱依次判断这下的加值。啊,那我们来往下去判断一下啊,来判断第二个值。第二个值跟它一样啊,就加一个string u.is empty,这个值叫做level啊,然后如果它不等于空,那咱也是拼接上这个条件,但是这个咱就要不要用like,用EQ。
19:13
这个字段的名字找一下它叫这个level,就这个啊level。写出来啊。Le,然后它的值就是咱说这个level啊,这是第二个条件,包括还有第三个,第四个都一样啊,那我来复制咱们快速改一下啊,第三个叫笔记。第四个叫and啊。还有这两值,但是这两条件要怎么写,给大家说明啊,因为这两值呢,我们要做的目的是什么,就查这个范围中的值,也就是说啊,比如我讲师每次在里边添加它是不是有一个创建时间,有,那我就查这个时间范围中的值,比如我现在查这个1月1号到1月31号,这是一个范围,那范围怎么样,也就是说。
20:04
咱是不是要大于开始时间,是不是要小于结束时间啊,用这个来做的,那我们来写一下啊,但是他们查的都是我们这个这个字段,这个创建时间这个字段。这个复制一下啊,然后咱们写一下啊,首先第一个。咱要大于开始时间大于不是,各位是否记得啊,是这个东西GT吗?GE是大于等于啊,那我写个大于等于了,第一个加它那个字段。第二个加一个叫笔记啊,注意这个位置啊,这样应该没说那么细,咱现在用到了这个加的不是你类中那个属性名称,是你表中的字段名称,但字段是不是带小号线,你需要加上这个名字。啊,这个位注意,然后下面有一个叫结束时间,那结束时间咱要小于等于,它小于等于应该叫啊,然后这个叫。结束时间啊。这样的话,咱把这条件做了一个拼接,就是根据我这个值是否等于空,然后咱们来拼接上这么一个条件,最终啊rap中用力不同值,然后咱们把rap传到里面去,最后可以查询出来。
21:13
啊,这个是咱们写的这么一个基本方法啊,咱们把它就做到了。这是一段代码啊。然后这步骤我在里边大体写一下啊,第二步就是咱们就是根据你的条件值,然后进行判断啊,拼接梳你的那个条件,然后最终做到这个查询啊,主要这个过程代码我就不截过来啊,咱们刚才刚写过啊。所以现在按照这个过程,咱们就把这个多条件查询再分页,我们就做到了,最后重复一遍,然后再来测试啊,而它的过程就是首先传入当前页每个技入数,然后咱用一个对象,就是view对象,叫teacher quely,传入它那个条件值Z号,咱用代码来实现,但是因为条件值可能有,也可能没有,所下面我们做了判断,如果它不等于空,咱才有这个条件拼接构建,如果等于空,咱就不需要构建,在构建的时候,名称是我查询级别是等于,然后这个时间开始是大于等于,结束时小于等于最终。
22:21
把这做到啊,主要这么一个过程,然后咱们把它就完成了啊,那完成之后,最后咱们把效果咱来试一下啊,看一下这个结果什么样的。我们来试一下啊。把这点开啊,找到我们的方法,这个方法啊,当然你可以加这个中文提示啊,就那注解,然后大家看里边啊,你注意看啊,目前是这一种情况,这表示当前页,这表示每个基数,比如我随便写一个一写个二。然后你看啊,这三个值就是这四个值是什么呢。是不是咱这条件啊,Name level begin and,它对应的是咱们这个will lay中的是不是这四个属性,所以你在里边KC的值,比如说我这里边写一个章啊,它根据章可以查询我写个级别,这个时间时间啊等等都可以做到啊,所以这是一种写法,咱这么做是可以做到的。
23:16
啊,所以大家把这注意啊给他知道怎么去写,但是我强调啊,就是这种写法啊,咱这么做功能绝对是没有问题,但是我们有一点给各位强调,在很多那个就是实际开发中,很多人啊,他不喜欢这么来串参数,很多人习惯怎么做呢,在这位置,他习惯就是他习惯加上一个注解来传啊,就你这么写,有同学说我就这么写有问题吗?没问题。但是很多人他不喜欢这么做,他喜欢怎么做,给大家演示一下啊,咱写的最常见的。怎么做呢?在前面加个注解,这个注解。这给大家特别说一下啊,这注解叫request body。包括咱们最开始写CTR的时候,咱还说了一个注解叫这个叫responsibility啊,注意啊,这两注解是不一样的,不说各位是否记得啊,应该是咱们在supreme l VC阶段应该提到过啊,那我来说一下啊,首先第一个就这个叫response。
24:17
它的作用是用于返回数据的,主要是用于返回那个这层数据,Response么响应就是返回这些数据的,然后第二个注解叫request body。这注解什么意思给大家啊,特别说明关于这个注解啊,这个含义啊。就是快的保底。它的作用是什么呢?我来解释一下啊,希望各位给他记住啊,它的作用就是我们现在使用这个这啊就是使用。Jason形式来传递数据,然后他会把这个Jason那个数据。啊,给我们封装到对应的对象里面去,这叫request body,就是用Jason传出去,也就是说啊,我们现在在里边呢,比如说咱加了body,然后你前端代传数据,用Jason传,然后他传过数据就会帮我们封装到这个teacher中,这叫request body,就用Jason传数据。
25:17
还有一个叫瑞response保底,两个是不一样的啊。棒的,保底。然后response body什么意思呢?刚才也提到了。它就表示啊,我们要返回数据,但是返回数据一般都是一个data数据。啊,这次数据当然也可以反其数据,这咱一般都用这层数据做返回啊,这是两注点,所以我们在实际中很多人更习惯用request body底来传数据啊,咱现在也这么来做request body底啊,包括你不用它也可以,就不用它是这种情况,那我们现在改成包底。但是你改成这个包地中啊,有这么几个问题给大家说明啊,我强调第一个。
26:00
如果说你要改成保底,你的这个提交方式,需要使用这种提交方式,就是POS提交方式,用get这值取不到啊,这一点各位注意啊,用request的body底需要改成POS抵胶get取不到,那我给它改一下啊。然后这里边还有一个特点啊,大家注意啊,就刚才我提到的这些条件值,问各位他们是不是可以都没有就可以没有这个值啊,所以没有这个值你要写它还有一个问题,咱需要加上一个属性叫require等于P。啊,等于for。那什么意思呢?就表示啊,这个值可以没有啊,这是它的一个描述啊,就是required等于false,表示这个值可以没有。啊,就是我们这个参数值可以没有可以为空。啊,单数值。可以回空啊,如果你不加这个拿个纸必须要有啊,主要这个特点,所以咱现在就改成瑞的保底啊,我再重复一遍,然后最后咱测试,因为后面咱都这么做啊,做法就是咱把条件值通过A数据传递,然后放装到对象中去,那怎么传,需要加个快的body底。
27:17
然后这个表示这值可以没有,因为这条件值可以为空,另外就是你用了块的包底之后,它的提交方式必须是个POS提交,如果你是get提交,那这值是取不到的啊,这一点各位要特别注意,所以咱把它做了一个改造啊,再用这种方式。把它做到。啊,这是我们写一种方法啊,后面咱们都这么来做,包括实际中很多人也都习惯用这个块的body底来做我们这个相关内容。啊,就是他啊。然后这个做到之后啊,最后咱把这服务器我给它重新启动,咱最后来试一下啊,看一下我们最终的结果是什么样的,咱通过测试就是各位再进一步看一下这这块的包底到底是什么样的。
28:03
啊,最后大家看一下啊。
我来说两句