Mybatis分頁插件PageHelper正確的用法(網上有2篇不夠科學的文章)


今天下午在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前端高級project師 現百度高級project師,
張少龍-默默。
他也自己實現了一個插件,今后再分享出來。


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM