原理:
pageHelper会使用ThreadLocal获取到同一线程中的变量信息,各个线程之间的Threadlocal不会相互干扰,也就是Thread1中的ThreadLocal1之后获取到Tread1中的变量的信息,不会获取到Thread2中的信息,所以在多线程环境下,各个Threadlocal之间相互隔离,可以实现,不同thread使用不同的数据源或不同的Thread中执行不同的SQL语句,所以,PageHelper利用这一点通过拦截器获取到同一线程中的预编译好的SQL语句之后将SQL语句包装成具有分页功能的SQL语句,并将其再次赋值给下一步操作,所以实际执行的SQL语句就是有了分页功能的SQL语句。
使用方法
1.加jar包
<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.0.0</version> </dependency>2.在db.xml配置文件中<property id="plugins"></property>节点配置相关的内容(采用的是oracle数据库,5.0以上的pagehelper采用的是helperDialect=oracle)
<!--配置 MyBatis factory--> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="mapperLocations"> <array> <value>classpath*:mapper/*.xml</value> </array> </property> <property name="typeAliasesPackage" value=" com.wisemax.common.dto, com.wisemax.sm.dto, com.wisemax.lim.dto, com.wisemax.hnrb.dto"/> <property name="plugins"> <array> <bean class="com.github.pagehelper.PageInterceptor"> <property name="properties"> <value> helperDialect=oracle </value> </property> </bean> </array> </property> </bean>3.pageHelper的使用,采用test类进行测试!
1.测试中PageHelper.startPage(3,10)传人的参数是当前页码,和每页显示的条数。
2.根据条件查询对应的List,最后将List扔进到Pageinfo的构造方法中。
3.最终返回给页面的的List是PageInfo中的List,通过getList()获得对应的返回集合即可。
4.如果前端页面需要总的条数。直接使用a.getTotal()得到的即是符号查询条件的总条数目。
@Test public void Select() { PageHelper.startPage(3, 10); List<HnrbUser> list = hnrbAppInfosMapperl.queryUserByPgeHelper(); PageInfo<HnrbUser> a = new PageInfo<>(list); System.out.println(" a = " + a.toString()); System.out.println(a.getTotal()); for (HnrbUser s:a.getList() ) { System.out.println("UserName" + s.getUserName()); } }对应的sql为下图所示。由于是测试,所以对应的查询条件为空,Sql中不设置对应的分页信息。(之前使用的是rownum 作为一个字段,然后根据分页信息大于小于该字段。现在使用pageHelper不需要rownum了)
<select id="queryUserByPgeHelper" resultType="com.wisemax.hnrb.dto.HnrbUser" > select user_name as userName FROM COM_T_USER ORDER by user_name desc </select>运行上面的test方法控制台输出的内容为下图所示。