一种基于spring和mybatis的分页查询方法与流程

文档序号:35672563发布日期:2023-10-07 22:16阅读:29来源:国知局
一种基于spring和mybatis的分页查询方法与流程

本发明涉及数据处理,特别涉及一种基于spring和mybatis的分页查询方法。


背景技术:

1、现在市面上mybatis分页方案用的最多的是com.github.pagehelper的分页方案,它的使用如图1。图1中“list<inserttest>list=mapper.list("hello")”,mapper的list方法定义的全貌为:list<inserttest>list(string s)。从图中可以看出原来返回类型为list的方法,在此方法前执行pagehelper.startpage后,将返回pagehelper的page类型,并可以将返回结果强制转换成page类型。

2、实际使用中,每家公司都会定义自己的分页对象类型,因此在得到pagehelper的page类型后,如图2所示,往往还要将该类型转换成自己用的分页对象类型。

3、其次对于是否使用分页,是由当前方法是否用了pagehelper.startpage来决定。作为当前方法的调用者来说,做不到由调用者来决定返回分页还是list。

4、最后,对于mapper的list方法所对应的sql语句,可以利用它产生count的sql语句。而pagehelper不能将count的结果单独返回。而在实际使用中,有时是因为不需要list,为了优化性能,就希望只执行count的sql语句,并得到结果,而不去执行返回list的sql语句。


技术实现思路

1、为了克服现有技术存在的缺陷,本发明提供一种基于spring和mybatis的分页查询方法,以解决上述的问题。

2、本发明解决其技术问题所采用的技术方案是:一种基于spring和mybatis的分页查询方法,包括以下步骤:

3、s1:在spring dao层的方法被调用时,该调用通过拦截层daopageinterceptor获取spring dao层当前被调用的方法信息,其中所述方法信息包括方法的返回类型和方法的参数;

4、拦截层daopageinterceptor取出方法的返回类型并查找list字段和count字段;

5、s2:拦截层daopageinterceptor在方法的参数中查找被@currentpage和@pagesize标注的两个参数;

6、s3:于sql上下文sqlcontext记录返回类型returntype={返回类型的类信息}、currentpage={@currentpage所标注的参数}和pagesize={@pagesize所标注的参数};

7、s4:调用到达mybatis分页插件paginginterceptor后,先从sql上下文sqlcontext中取出currentpage的值和pagesize的值;

8、s5:若pagesize的值为0时,只返回count结果;若pagesize的值等于integer.max_value时,只返回list结果;

9、s6:当返回的list结果到达mybatis分页插件paginginterceptor时,通过接口方法boolean haswrapperfor(object object)从sql上下文sqlcontext取出返回类型returntype;

10、s7:mybatis的接口方法objectwrapper getwrapperfor(metaobjectmetaobject,object object)根据返回类型returntype,新建一个返回对象,同时新建一个分页包装对象pageobjectwrapper,将返回对象封装到分页包装对象pageobjectwrapper中,最后返回该分页包装对象pageobjectwrapper;

11、s8:在得到mybatis执行器返回的list结果后,mybatis调用pageobjectwrapper对象的addall方法;

12、最后,mybatis从分页包装对象pageobjectwrapper中取出返回对象返回给springdao层的方法。

13、值得说明的是,所述步骤s1中,当spring dao层的方法被调用时,该调用通过拦截层daopageinterceptor内的object doaround(proceedingjoinpoint pj)方法中的参数pj获取spring dao层当前被调用的方法信息。

14、可选的,在所述步骤s1中,通过@list标注list字段,通过@amount标注count字段,拦截层daopageinterceptor取出方法的返回类型后查找@list和@amount标注的字段。

15、具体地,在所述步骤s5中,若pagesize的值等于0,通过原sql语句,获取countsql,然后只执行countsql语句,得到的结果pagecount={count结果}记录到sql上下文sqlcontext中,并将原sql语句修改为select 1from dual where 1=0,执行修改后的原sql语句并返回一个空的list字段。

16、优选的,在所述步骤s5中,若pagesize的值等于integer.max_value,执行原sql语句,并返回list结果。

17、值得说明的是,在所述步骤s5中,若pagesize的值不为0且pagesize的值不等于integer.max_value时,通过原sql语句,获取countsql的结果和pagesql的结果,countsql的结果pagecount={count结果}记录到sql上下文sqlcontext中,pagesql的结果则返回。

18、可选的,在所述步骤s8中,mybatis调用pageobjectwrapper对象的addall方法包括:将传入的list的结果,用java的反射机制,放置到返回对象被@list所标注的list字段中;

19、从sql上下文sqlcontex中取pagecount,用java的反射机制,放置到返回对象被@amount所标注的count字段中。

20、本发明的有益效果在于:在所述基于spring和mybatis的分页查询方法中,mapper里的方法可返回定义的分页类型。当前方法可以直接将mypage对象返回给调用者即可;当需要只返回count时,@pagesize所标注的参数传0,此时将执行count sql,只返回count结果;当需要只返回list时,@pagesize所标注的参数传integer.max_value,此时将执行listsql,只返回list结果。如此,使用者可以定义并使用自己的分页对象,还能单独只获取count结果或list结果。



技术特征:

1.一种基于spring和mybatis的分页查询方法,其特征在于,包括以下步骤:

2.根据权利要求1所述的一种基于spring和mybatis的分页查询方法,其特征在于:所述步骤s1中,当spring dao层的方法被调用时,该调用通过拦截层daopageinterceptor内的object doaround(proceedingjoinpoint pj)方法中的参数pj获取spring dao层当前被调用的方法信息。

3.根据权利要求2所述的一种基于spring和mybatis的分页查询方法,其特征在于:在所述步骤s1中,通过@list标注list字段,通过@amount标注count字段,拦截层daopageinterceptor取出方法的返回类型后查找@list和@amount标注的字段。

4.根据权利要求3所述的一种基于spring和mybatis的分页查询方法,其特征在于:在所述步骤s5中,若pagesize的值等于0,通过原sql语句,获取countsql,然后只执行countsql语句,得到的结果pagecount={count结果}记录到sql上下文sqlcontext中,并将原sql语句修改为select 1 from dual where 1=0,执行修改后的原sql语句并返回一个空的list字段。

5.根据权利要求4所述的一种基于spring和mybatis的分页查询方法,其特征在于:在所述步骤s5中,若pagesize的值等于integer.max_value,执行原sql语句,并返回list结果。

6.根据权利要求5所述的一种基于spring和mybatis的分页查询方法,其特征在于:在所述步骤s5中,若pagesize的值不为0且pagesize的值不等于integer.max_value时,通过原sql语句,获取countsql的结果和pagesql的结果,countsql的结果pagecount={count结果}记录到sql上下文sqlcontext中,pagesql的结果则返回。

7.根据权利要求6所述的一种基于spring和mybatis的分页查询方法,其特征在于:在所述步骤s8中,mybatis调用pageobjectwrapper对象的addall方法包括:将传入的list的结果,用java的反射机制,放置到返回对象被@list所标注的list字段中;


技术总结
本发明公开了一种基于spring和mybatis的分页查询方法,属于数据处理技术领域;通过拦截层获取spring dao层当前被调用的方法的返回类型和方法的参数;拦截层取出方法的返回类型并查找List字段和count字段;拦截层在方法的参数中查找标注的参数;上下文记录返回类型;调用到达分页插件后,从上下文中取出pageSize的值;若pageSize的值为0,只返回count结果;若pageSize的值等于Integer.MAX_VALUE,只返回List结果。所述分页查询方法解决了现有的分页查询使用者不能定义并使用自己的分页对象,以及不能单独只获取count结果或List结果的问题。

技术研发人员:李宝君,何玉华
受保护的技术使用者:全通金信控股(广东)有限公司
技术研发日:
技术公布日:2024/1/15
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1