00:00
说到我们持久层的功能呢,那么不得不提到分页功能,那这个肯定是我们业务当中啊,其实看起来最简单,但却也是最重要的一个功能,任何的一个系统当中就必须有这样的一个功能,所以呢,我们来看一看在my business plus这个框架当中,它是如何实现这个分页的,那我们来看啊,首先第一个步骤添加一个配置类,这个配置类呢,我们会以这个配置的一个并对象的形式存在,所以呢,我们就添加一个con包,然后在con包里面呢,添加一个我们自定义名字的一个类,这个类叫什么都行啊,好,那我们就定义成my bet plus con吧。那我们打开我们的应用程序,在我们的这个里面。添加一个类叫做my be class conig,并且呢,我们把它放在can f这个包当中,好,接下来呢,在这个类当中我们添加一个注解,这个注解呢,首先你要保证它是一个配置文件,所以呢,我们添加configuration,证明我当前这个类是一个配置文件,那我们应用程序启动的时候,它就会被自动的被spring容器读取,并且以配置的形式读取啊好,那么现在呢,我们的这个应用程序既然是针对买贝plus的配置,也就是说实际上我们的买plus是我们应用程序的持久层啊,是针对持久层的配置,所以呢,我们希望把所有关于持久层配置的东西呢,都拿到这里进行集中的管理。那么之前呢,我们在my be plus application这个地方呢,写过一个micro sky,实际上呢,这个也是针对19层的一个扫描配置,所以呢,我们可以把这个。
01:51
扫描剪切出来。这是可选的一个步骤啊,你你不改也行。改的话呢,更好一些,把它拿到这来,这样的话呢,所有关于持久层的配置我们都写在这块。
02:04
啊,我们的项目的这个管理呢,就会更集中一些,好,建议大家这样去做一下,那接下来呢,我们就在这个地方呢,配置我们的分页插件,这个分页插件怎么配呢?不用我们自己去写啊,在我们的。官方文档当中,这是逻辑删除。逻辑删除哈,我们在找这个分页,有没有分页这呢分页插件啊,再点到这来。好,然后呢,我们找到。分页插件之后呢,你会发现它这块呢,就告诉你怎么配了,怎么配呢,它给我们提供了几种方案,第一就是如果你不使用spring boot的话,你配那个XML,大家学习spring boot之前不都配那个。嗯,XML文件嘛,对不对,那我们就这么配啊,那如果你使用spring boot的话。Spring的方式,那我们就这么配,诶把它复制过来。
03:03
好,这个有兴趣的话你看啊,我先把它删掉。把它复制过来,把它复制过来之后呢,呃,因为这个目前为止,它官方文档给我们的就是。这么一个方法哈,我看一下啊,分页插件叫做my biggest plus intercept。这个是之前的旧版本的一个方法,当然也可以用,但是呢,因为这个是旧版本的方法,所以你会发现它可以用是可以用,看着不太好看,都删掉了,是不是就是不建议使用了,所以呢,如果你想用更新的新版本的方法的话呢,我们再往下看啊。再往下看,看看他有没有,他在这个分页的这个里面就没写,你发现了吧啊,所以他这个文档更新的就就不是特别及时,但是呢,他在另一个地方,其实提到了这样的一个插件的一个使用在哪呢。
04:03
嗯,你找一下啊。这儿呢?这块有一个插件主体啊,有一个分页,我们点这块。好,所有的插件呢,我们是以什么形式存在的呢?是以这种intercepts的一个形式存在的啊好,那么也就是说这相当于一个拦截器是不是啊,然后所有的插件呢,都是以拦截器的形式存在的,那这样的话呢,我们就可以看看它的这个使用方式点进去。使用方式看spring boot的形式啊,那也就是说只要你想做插件的话,你就干嘛呢,你就创建这样的一个intercept。然后呢,你如果想分页插件的话,那你就把分页插件的这个对象呢,给它创建出来,然后呢,添加到我们的inner intercept里面,就添加到内置的一个呃,插件管理器里面,或者说添加到内置的一个拦截器管理器里面,就叫intercept,好,这样的话呢,其实就是我们的一个分页插件的一个具体使用了,所以大家其实在看这个文档的时候哈,虽然有的时候呢,他能够给我们提供帮助,但是有的时候他迷惑性也挺强的,比如说你是一个买beat plus的新用户,你对他的之前的版本不太了解的话,那么你可能就会陷入到这个地方来。
05:26
就是刚才他说到的这个分页插件,但是这是个老功能,他没有去更新文档,所以如果你及时能意识到这个问题的话呢,你就可以在这个地方找到它新功能的一个,呃,就是这个插件的一个使用,那么大家可以看到这个地方写的是things3.4.1对不对,呃,3.4.0对不对,我们这个版本是3.4.1啊,所以从3.4.0开始,插件呢,就有了一个新的使用方式了,好,那么这个使用方式呢,就是它了。啊,然后这个就是你看新的分页插件的使用方法嘛,好,我们把它复制过来。
06:01
所以呢,替换原来的这个老版本就可以了。好,那这块呢,就是我们的整个的一个分页插件了,那原理跟刚才我说的是一样的哈,就是先创建一个intercept这样的一个插件管理器,或者说拦截器的一个管理器,然后接下来呢,具体的把我们要做的分页插件的这样的一个拦截器给它创建出来,创建出来呢,把这个分页插件的这个拦截器对象呢,通过这个ADD inner intercept方法把它。这个配置到这个intercept对象里,然后呢,把这个intercept对象作为一个并对象返回就可以了,那么同样呢,在这个地方DB type,我们必须是买circle。因为实际上针对于每一种关系型数据库来说的话,它的分页的circleq语句都是各不相同的,比如说主流的买circlele Oracle circleql server这三种类型的数据库的分页circleq语句都是不一样的,而且差别很大啊,所以说呢,我们必须得把方言写上啊,我们是要针对买circle做分页啊,所以呢,你写上之后呢,它就会给你生成my circle相关的分页语句的语法,那就是limit了啊,它会追加limit,好,这样的话呢,我们的分页配置。
07:15
就配好了,配好了之后呢,我们就可以对我们的分页功能进行测试了,那既然它是intercept,我们就写一个intercept。针对这个插件做测试啊,在这个地方右键。New。Class。Intercept。Ten。好,然后接下来呢,同样在这个地方呢,我先把spring test这样的一个环境呢,给它定义出来,然后呢。Source啊,我来注入什么呢?我先注入这个user map吧。好,然后接下来呢,我写什么样的一个测试用例呢?我来写一个public voice。
08:08
Test。Select。配置,我来进行一个分页查询,那么如何进行查询呢?User map。点select,这里面有一个叫做配置的一个方法,这个select配置这个方法呢,它接收两个参数啊。这两个参数呢,一个。是我们的分页对象。啊,另一个是我们的查询对象,好,查询对象这块呢,昨天是给大家留作业了,但是我还没有具体的跟大家说,所以咱们暂时先给它设置为,那就是没有任何查询条件,只做分页,所以呢,我们第二个参数给它设置为,那而第一个参数就是一个什么呀,分页参数对象,分页参数对象我们怎么做呢?我们先把它扭出来啊扭。
09:03
叫配置。好,这个是我们的分页对象,然后呢,分页对象里面有个泛型,你要针对谁做分页,我要针对user做分页,你怎么分,我要查询第一页。每页五条记录,我要这样查好,接下来呢?我先把user给他引进来。好,然后接下来呢。我把这个配置对象呢,给它定义出来,好,那这块呢,就是我们要的这个。分页。参数对象了。那这个分页参数对象呢,我们就可以传到。这个位置了,所以通过这个方法我们传递进来一个分页参数对象,而这个分页参数对象指定了我们的页码current啊,当前页码是1SIZE啊,每页记录数是五,所以通过这样的一个查询呢,我们就可以。
10:03
查到我们分好页的一个结果了,当然你会发现它的这个返回值是什么呀?跟他一样是不是啊啊,所以大家注意啊,这个对象和这个对象其实是。同一个对象其实是同一个对象啊,所以你没有必要去给他再进行一次赋值,当然了,你也没有必要去。去去去去给它赋值了,那么其实它就是它,而它返回来的那个值啊,它返回来的那个值,刚才我们看到的就删掉的和它是其实是一样的,所以我们从它。这个参数里面直接拿我们的结果就行了。点get大家看为什么叫分页参数对象啊,里面有和页码相关的很多值,比如说当前是第几页,比如说。啊,一共有多少页,比如说一共有多少条记录啊等等,好,我们呢来看一下,还有一个方法呢,叫get records,这个方法呢,它的返回值是list user,所以我们要的就是它,这个呢就是当前。
11:10
这个页码下的所有的记录了,好,那么我们就get records。那我们把这个users呢给他拿到,然后接下来。嗯。When。我打印吧。Users点。For each。好把它打印出来是不是啊,接下来呢,我们来运行一下啊。好,运行成功,那么我们来看一下结果。结果最重要的呢,就是我们看一下circle,你看一下这个circle叫select列名。
12:02
然后呢?From。He user。Where?这个是查询没被删除的记录啊,然后limit对吧,Limit这块呢,它。有一个问号,因为查的是第一页嘛,所以呢,他就传一个五就行了,这个呢,就是第一页的五条记录啊,那如果你查第二页。运行。好,我们来看一下它的最终的结果。如果查第二页的话。是不是就limit偏移量,然后查询的记录数,那第二页每页五条偏移量应该是五对不对,然后呢,一共查五条,所以呢,这个就是分页查询啊的一个具体的用法,那么还没有完啊,注意假设说呢,我在这个地方吧,我设一个断点啊,我们来debug一下右键。
13:10
然后呢,我来进行一个debug好运行。好,现在呢,我们这个。Select page呢,实际上已经执行完了,我们要看什么呢?我们要看这个配parameter page parameter在被我们执行之前,它实际上就有两个内容,一个是current,就是当前是第几页,还有一个呢是size,每页有多少条记录,但是一旦这个select配置被执行完毕之后,我们再来看一下这个配置parameter,它里面的值就比较丰富了,比如说它有。一共有多少条记录,他在查询的过程当中呢,他会给你做一个计算啊,就是total,还有呢就是呃,Size当然是最开始我们的设置,Current最开始我们的设置,还有呢就是。
14:10
嗯,刚才我们取出来的当前的这个页里面的所有的数据集合,然后还有呢,就是。嗯,我看一下啊。Is orders current size total。嗯。还有一个方法。我们需要通过另外的一个方式来给他拿到,好,我先执行完毕啊。这大家了解吧,就是说刚才我在这个配置parameter里面,除了能够拿到之外,还能拿到什么。是不是还能拿到,我一共有多少条记录啊?好,这个是怎么拿到的?这是怎么拿到的?然后还能拿到什么,还能拿到刚才我们没看见的啊,叫做有一个叫做has next有没有下一页。
15:07
啊,有没有下一页。好,还能拿到什么?还能拿到一个叫做has previous,有没有上一页?那我这个呢,叫。BN吧。这个呢叫BP啊,写的好一点。然后接下来呢,我们先来运行一下啊。
16:03
好,我们往下转。你会发现一共有33条记录,有没有下一页,有有没有上一页,有因为33条记录吗?每页五条记录,它肯定是有下一页的,然后呢,嗯,那现在是第二页,它肯定是有上一页的,对不对啊,那我们给它换成,比如说换成第一页。再运行一下。好,那我们来看这个结果有没有上一页。没有,因为它是第一页,是不是有没有下一页有好,那这个是很好理解的,我们再来看前面啊。看前面。这个是他打印的日志哈。好,往下走一下。看看他输出的so。
17:00
注意这。这个可不是查询记录数呀,这个是不是查询。根据当前的查询条件算一下总记录数呀,啊,所以为什么在这个地方我们会打印出total,或者是说为什么会有total,单纯的通过一个select语句,而且是查询当前页码的这样的一个所有的记录一共就五条嘛,你怎么算出总记录数啊,一定是有这样的一个统计函数在呀,对不对,所以。这个功能不用我们自己写了,只要我们配了分页插件,那么这个功能它是自动帮助我们在整个的查询的过程当中。智能的计算出来的啊,或者是说实际上是他的这个select的配置方法里面啊,帮助我们计算出来了一共有多少条记录,并且呢,把总记录数填充到了这个配置parameter这个参数里面,当然因为这个参数是一个对象类型的参数,所以呢,你在这个方法当中,方法内部对参数进行了填充,进行了修改,那么在方法外部我们依然可以拿到已经修改完毕的这样的一个对象的参数值,对不对,或者说这个对象的一个属性值啊好,所以呢啊,我们。
18:21
之所以要把这个值拿出来啊,进行一个单独的计算啊,在我们的这个买贝斯plus的底层,原因呢,就是啊,它最终要填充这个分页对象,在分页对象当中呢,给我们提供这样的一些值,帮助我们未来在前端展示的时候,能够方便的展示一些页码相关的。变量信息明白吧,啊,所以这个就是整个分页给我们提供的功能啊,所以总结一下呢,就是他不但完成了分页的查询,还顺便帮助我们把分好页之后,你所需要展示的一些额外的一些辅助的内容,比如说总记录数,有没有上页,有没有下页,都在这一个方法当中给咱们计算出来了,并且把它组织好了,组织到这个对象当中,然后方便的我们去获取啊好,这是我们的分页功能。
我来说两句