Mybatis分页插件PageHelper正确的使用方法(网上有2篇不够科学的文章)

时间:2023-01-10 22:38:37
今天下午在Mybatis项目中,实现分页。因为我是后加入项目中的,Leader用的是PageHelper这个组件,但是我在实际使用的过程中遇到了2个大问题。

 1. http://www.oschina.net/news/53808/mybatis_pagehelper-3-2-2?p=2#comments
    在这篇文章中,作者有提到需要增加PageHelper的配置,原话“ 或者如果你使用Maven,你可以添加如下依赖:  

   这句话是有问题的,
  
< plugins >
     <!-- com.github.pagehelper为PageHelper类所在包名 -->
     < plugin  interceptor = "com.github.pagehelper.PageHelper" >
         < property  name = "dialect"  value = "mysql" />
         <!-- 该参数默认为false -->
         <!-- 设置为true时,会将RowBounds第一个参数offset当成pageNum页码使用 -->
         <!-- 和startPage中的pageNum效果一样-->
         < property  name = "offsetAsPageNum"  value = "true" />
         <!-- 该参数默认为false -->
         <!-- 设置为true时,使用RowBounds分页会进行count查询 -->
         < property  name = "rowBoundsWithCount"  value = "true" />
     </ plugin >
</ plugins >
   这几段插件配置的代码,应该放到Mybatis的config配置文件中,而非Maven。
  
   后来,听Leader说,他在这也被误导了,搞了一天时间吧。

2. 
http://www.oschina.net/p/mybatis_pagehelper
   作者使用PageHelper的方法不太对,虽然Java后台测试是可以的,但是在FTL中显示的时候,EL表达式不能正常显示。

   作者的代码:
   
@Test
public void testPageHelperByStartPage()  throws Exception {
     String logip =  "" ;
     String username =  "super" ;
     String loginDate =  "" ;
     String exitDate =  null ;
     String logerr =  null ;
     //不进行count查询,第三个参数设为false
     PageHelper.startPage( 1 10 false );
     //返回结果是Page<SysLoginLog>    
     //该对象除了包含返回结果外,还包含了分页信息,可以直接按List使用
     List<SysLoginLog> logs = sysLoginLogMapper
             .findSysLoginLog(logip, username, loginDate, exitDate, logerr);
     Assert.assertEquals( 10 , logs.size());
 
     //当第三个参数没有或者为true的时候,进行count查询
     PageHelper.startPage( 2 10 );
     //返回结果是Page<SysLoginLog>    
     //该对象除了包含返回结果外,还包含了分页信息,可以直接按List使用
     Page<SysLoginLog> page = (Page<SysLoginLog>) sysLoginLogMapper
             .findSysLoginLog(logip, username, loginDate, exitDate, logerr);
     Assert.assertEquals( 10 , page.getResult().size());
     //进行count查询,返回结果total>0
     Assert.assertTrue(page.getTotal() >  0 );
}

    如果在Freemarker的FTL页面中,打印${
page.pageNum }会报错,大致的意思是“expected a hash,but is a sequence”,
期待是hash类型,但实际上序列,list、ArrayList都算作序列。

    这个地方情况比较特殊,
Page是一个JavaBean,有若干属性,但是他又继承了ArrayList。经实际分析,
Freemarker把这个对象当作了ArrayList,可以直接遍历<#list page as item></#list>。

     正确的方法应该是:
http://www.oschina.net/news/53808/mybatis_pagehelper-3-2-2?p=2#comments

   
PageHelper.startPage( 1 10 );
List<Country> list = countryMapper.selectAll();
PageInfo page =  new  PageInfo(list);
assertEquals( 10 , list.size());
assertEquals( 239 , page.getTotal());


3.我的实际代码和效果

${page},
${page.pageNum}

打印结果:
com.github.pagehelper.PageInfo@125d70de, 1

 关键代码:
public PageInfo list(WithdrawForm form) {
PageHelper.startPage(form.getNumber(), form.getSize());
List<Map<String, Object>> list = withdrawDao.list(form);
PageInfo page = new PageInfo(list);
return page;
}  

 Leader在从网上寻找方法的时候,正好遇到了和采纳了这些不够科学的方法,他写的程序是可以运行的,有2点原因。
他没有在Maven中配置那个Plugin,而是在Mybatis中。出于其他需要,正好没有直接使用Page对象,而是使用自己组装的Bean。 
 
  今天遇到了这2个大问题,特意总结下,希望后来的人,不要再被误导了。

  除了PageHelper这个分页插件,我在秒针工作的时候,原秒针Web前端高级工程师 现百度高级工程师,
张少龙-默默,
他也自己实现了一个插件,今后再分享出来。


小雷FansUnion
2014年10月20日
湖北武汉