本发明涉及数据处理,特别涉及一种基于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字段中;