Mybatis + SpringMVC + Maven實現分頁查詢 (推薦采用的插件是PageHelper)
先看一下之前的這篇博客,這里推薦了 Mybatis 的分頁方法。
按照上面的方法設置后,確實實現了分頁,可是 對於其原理還不甚理解,對其加以了分析之后,本篇博客,則用來說明使用該插件的過程中產生的疑惑。
java 中的實現代碼:
public PageInfo<Users> selectUsersByIsaByPage(Integer isapproval,Integer pageNo,Integer pageSize) { pageNo = pageNo == null?1:pageNo; pageSize = pageSize == null?10:pageSize; PageHelper.startPage(pageNo, pageSize); List<Users> list = userDao.selectUsersByIsapproval(isapproval); //用PageInfo對結果進行包裝 PageInfo<Users> page = new PageInfo<Users>(list); //測試PageInfo全部屬性 System.out.println(page.toString()); return page; }
1、實現
我們只需要使用 PageHelper.startPage(pageNo,pageSize) 函數來指定 pageNo(第幾頁) 和 pageSize(每頁顯示幾條記錄)兩個參數,然后調用原來的查詢,就進行了分頁,最后返回的是list,轉換成 PageBean 類型的結果即可,前台就可以根據 PageBean 來取得對應需要的值了
2、關於 PageBean
分頁查詢結果 返回的是一個 page 對象,而Page 對象 繼承自ArrayList,但是如果我們直接返回 ArrayList 的話,比如在 JSON 處理Page 類型的結果時,會被當成 List 來Json 格式化 會丟棄掉 Page 對象的所有擴展屬性。為了保留這些屬性,所以將分頁Page類型裝換成我們自己定義的PageBean, 自己定義個沒有繼承ArrayList 的PageBean ,包含一個List 的屬性來保存分頁結果。
PageInfo 是插件作者給我們提供的一個參考例子,當然可以直接使用,也可以 根據自己的項目情況,定義一個PageBean來保存分頁之后的結果,需要哪些屬性,就加入哪些屬性。
我只想要 Page 里面的list 就是查詢到的對象……
3、PageHelper 的原理是基於 攔截器實現的。
攔截器的配置有兩種方式,一種是mybatis 的配置文件中配置,一種是直接在Spring 的配置文件中進行
4、我有一個重要的 bug,暫時還不知道原因
我的項目中使用到了 AOP的,(不確定原因是不是這里)
比如,我有一個對象 dict,對象中有一個屬性user來表示當前用戶,如果用戶不存在,則會去數據庫查詢。於是 我的分頁查詢 dict,結果就是攔截器攔截的查詢是 用戶,結果放在了PageInfo 中,而不僅僅是簡單的dict 的分頁……